import Vue from 'vue'
import router from '@/router/index'
import { Message } from 'element-ui'
import {
	fileImgMap,
	unknownImg,
	fileSuffixCodeModeMap,
	markdownFileType
} from '@/libs/qiwen/map.js'
import { officeFileType } from '@/libs/qiwen/map.js'
import { getViewUrlDbPath } from '@/api/wps'
import store from '@/store'

// 全局函数 - 文件相关
const fileFunction = {
	/**
	 * 格式化文件大小
	 * @param {number} size 文件大小
	 * @param {boolean} isInteger 是否只显示整数位，默认不截取
	 * @returns {string} 文件大小（带单位）
	 */
	calculateFileSize(size, isInteger = false) {
		if (size == null)
			return 0 + 'KB'

		const B = 1024
		const KB = Math.pow(1024, 2)
		const MB = Math.pow(1024, 3)
		const GB = Math.pow(1024, 4)
		if (isInteger) {
			// 截取为整数
			if (size < B) {
				return `${size}B`
			} else if (size < KB) {
				return `${(size / B).toFixed(0)}KB`
			} else if (size < MB) {
				return `${(size / KB).toFixed(0)}MB`
			} else if (size < GB) {
				return `${(size / MB).toFixed(0)}GB`
			} else {
				return `${(size / GB).toFixed(0)}TB`
			}
		} else {
			// 保留小数位
			if (size < B) {
				return `${size}B`
			} else if (size < KB) {
				return `${(size / B).toFixed(0)}KB`
			} else if (size < MB) {
				return `${(size / KB).toFixed(1)}MB`
			} else if (size < GB) {
				return `${(size / MB).toFixed(2)}GB`
			} else {
				return `${(size / GB).toFixed(3)}TB`
			}
		}
	},
	/**
	 * 获取流式的缩略图、视频封面图
	 * @param {object} row 文件信息
	 * @returns {string} 流式图片
	 */
	getMinImgStream(row) {
		return `${process.env.VUE_APP_BASE_API}/filetransfer/preview?userFileId=${row.userFileId
			}&isMin=true&shareBatchNum=${row.shareBatchNum == null ? '' : row.shareBatchNum
			}&extractionCode=${row.extractionCode == null ? '' : row.extractionCode}`
	},
	/**
	 * 获取文件查看路径
	 * @param {object} row 文件信息
	 * @returns {string} 文件路径
	 */
	getViewFilePath(row) {
		return `${process.env.VUE_APP_BASE_API}/filetransfer/preview?userFileId=${row.userFileId
			}&isMin=false&shareBatchNum=${row.shareBatchNum == null ? '' : row.shareBatchNum
			}&extractionCode=${row.extractionCode == null ? '' : row.extractionCode}`
	},
	/**
	 * 获取文件下载路径
	 * @param {object} row 文件信息
	 * @returns {string}  文件下载路径
	 */
	getDownloadFilePath(row) {
		return `${process.env.VUE_APP_BASE_API}/v1/api/folder/transfer/downloadfile?userFileId=${row.userFileId
			}&shareBatchNum=${row.shareBatchNum == null ? '' : row.shareBatchNum
			}&extractionCode=${row.extractionCode == null ? '' : row.extractionCode}`
	},
	/**
	 * 复制分享链接
	 * @param {string} shareBatchNum
	 * @param {string} extractionCode
	 */
	copyShareLink(shareBatchNum, extractionCode) {
		let input = document.createElement('textarea') // 直接构建textarea以保持换行
		input.value =
			extractionCode === null
				? `分享链接：${this.getShareLink(
					shareBatchNum
				)}\n复制链接到浏览器中并输入提取码即可查看文件`
				: `分享链接：${this.getShareLink(
					shareBatchNum
				)}\n提取码：${extractionCode}\n复制链接到浏览器中并输入提取码即可查看文件` // 设置内容
		document.body.appendChild(input) // 添加临时实例
		input.select() // 选择实例内容
		document.execCommand('Copy') // 执行复制
		document.body.removeChild(input) // 删除临时实例
		Message.success('复制成功')
	},
	/**
	 * 根据文件扩展名设置文件图片
	 * @param {object} file 文件信息
	 */
	setFileImg(file, key = 'extendName') {
		if (file.isDir === 1) {
			//  文件夹
			return fileImgMap.get('dir')
		} else if (fileImgMap.has(file[key].toLowerCase())) {
			// 可以识别文件类型的文件
			return fileImgMap.get(file[key].toLowerCase())
		} else if (
			Number(router.currentRoute.query.fileType) !== 6 &&
			['jpg', 'png', 'jpeg', 'gif', 'mp4'].includes(
				file[key].toLowerCase()
			)
		) {
			// 图片、视频类型，直接显示缩略图
			return this.getMinImgStream(file)
		} else {
			// 无法识别文件类型的文件
			return unknownImg
		}
	},
	/**
	 * 判断是否是视频文件
	 * @param {object} file 文件信息
	 */
	isVideoFile(file) {
		if (
			['avi', 'mp4', 'mpg', 'mov', 'swf'].includes(
				file.extendName?.toLowerCase()
			)
		) {
			return true
		} else {
			return false
		}
	},
	/**
	 * 图片预览
	 * @param {*} currentIndex 当前图片索引
	 * @param {*} imgInfo 单个图片信息
	 * @param {*} imgInfoList 多个图片列表
	 */
	handleImgPreview(currentIndex, imgInfo = {}, imgInfoList = []) {
		// 图片分类下 - 传递整个页面的图片列表；非图片分类下 - 由单个图片构建图片列表
		const imgList =
			Number(router.currentRoute.query.fileType) === 1
				? imgInfoList.map((item) => {
					return {
						...item,
						fileUrl: this.getViewFilePath(item),
						downloadLink: this.getDownloadFilePath(item)
					}
				})
				: [
					{
						...imgInfo,
						fileUrl: this.getViewFilePath(imgInfo),
						downloadLink: this.getDownloadFilePath(imgInfo)
					}
				]
		const defaultIndex =
			Number(router.currentRoute.query.fileType) === 1 ? currentIndex : 0
		Vue.prototype.$openBox.imgPreview({ imgList, defaultIndex })
	},
	/**
	 * 视频预览
	 * @param {*} currentIndex 当前视频索引
	 * @param {*} videoInfo 单个视频信息
	 * @param {*} videoInfoList 多个视频列表
	 */
	handleVideoPreview(currentIndex, videoInfo = {}, videoInfoList = []) {
		// 视频分类下 - 传递整个页面的视频列表；非视频分类下 - 由单个视频构建视频列表
		const videoList =
			Number(router.currentRoute.query.fileType) === 3
				? videoInfoList.map((item) => {
					return {
						...item,
						fileUrl: this.getViewFilePath(item),
						downloadLink: this.getDownloadFilePath(item)
					}
				})
				: [
					{
						...videoInfo,
						fileUrl: this.getViewFilePath(videoInfo),
						downloadLink: this.getDownloadFilePath(videoInfo)
					}
				]
		const defaultIndex =
			Number(router.currentRoute.query.fileType) === 3 ? currentIndex : 0
		Vue.prototype.$openBox.videoPreview({ videoList, defaultIndex })
	},
	/**
	 * 音频预览
	 * @param {*} currentIndex 当前音频索引
	 * @param {*} audioInfo 单个音频信息
	 * @param {*} audioInfoList 多个音频列表
	 */
	handleAudioPreview(currentIndex, audioInfo = {}, audioInfoList = []) {
		// 音频分类下 - 传递整个页面的音频列表；非音频分类下 - 由单个音频构建音频列表
		const audioList =
			Number(router.currentRoute.query.fileType) === 4
				? audioInfoList.map((item) => {
					return {
						...item,
						fileUrl: this.getViewFilePath(item),
						downloadLink: this.getDownloadFilePath(item)
					}
				})
				: [
					{
						...audioInfo,
						fileUrl: this.getViewFilePath(audioInfo),
						downloadLink: this.getDownloadFilePath(audioInfo)
					}
				]
		const defaultIndex =
			Number(router.currentRoute.query.fileType) === 4 ? currentIndex : 0
		Vue.prototype.$openBox.audioPreview({ audioList, defaultIndex })
	},

	/**
	 * 文件预览——word使用wps预览，pdf使用pdf组件进行预览
	 * @description 若当前点击的为文件夹，则进入文件夹内部；若是文件，则进行相应的预览。
	 * @param {object} row 文件信息
	 * @param {string} extendNameKey 后缀名key，用哪一个字段进行后缀名的判断
	 * @param {string} urlKey 链接key，用哪一个字段进行url的打开
	 * @param {string} fileIdKey 文件id key，用哪个字段记录文件id
	 */
	handleFileNameClickNew(row, { extendNameKey, urlKey, fileIdKey }) {
		// 若是文件夹则进入该文件夹
		if (row.isDir) {
			router.push({
				query: {
					filePath: `${row.filePath === '/' ? '' : row.filePath}/${row.fileName
						}`,
					fileType: router.currentRoute.query.fileType
				}
			})
		} else {
			const WORD = ['doc', 'docx']
			const PDF = ['pdf']
			// 若当前点击项是word
			let extendName = row[extendNameKey]
			if (!extendName) {
				Message.error('预览失败！无法判断文件类型：文件类型' + extendName)
				return
			}
			extendName = extendName.toLowerCase()
			const fileId = row[fileIdKey] || row.fileId
			let pdfUrl = row[urlKey] || row.url//有部分url未加前缀，但是浏览器会自动寻址加到当前的主机

			if (!pdfUrl.includes('http')) {
				pdfUrl = process.env.VUE_APP_BASE_HOST + pdfUrl
			}
			// console.log('pdfUrl', pdfUrl);
			// return
			const { userId } = row
			if (WORD.includes(extendName)) {
				let flag = false
				if (!fileId) {
					Message.error('预览失败！文件ID失效：' + fileId)
					return
				}
				// 根据当前文件的作者的userId进行判断，和本人一致则是可编辑
				if (store.getters.userInfo.userId == userId) {
					flag = true
				}
				const params = {
					fileId,
					flag
				}
				getViewUrlDbPath(params).then(res => {
					if (res.data) {
						let resolve = router.resolve({
							path: '/wpsReader',
							query: {
								wpsUrl: res.data.wpsUrl,
								token: res.data.token,
								fileId,
								extendName,
								readOnly: !flag,//是否只读flag为True是可编辑
							}
						})
						window.open(resolve.href, '_blank')
					}
				})
				return false
			}
			else if (PDF.includes(extendName)) {
				if (!pdfUrl) {
					Message.error('预览失败！请检查该文件路径是否正确。文件路径：' + pdfUrl)
					return
				}
				let resolve = router.resolve({
					path: '/pdfReader',
					query: {
						fileId,
						url: pdfUrl
					}
				})
				window.open(resolve.href, '_blank')
				return false
			}

		}
	},
	/**
	 * 文件预览——原始奇文的方法，使用的onlyoffice预览
	 * @description 若当前点击的为文件夹，则进入文件夹内部；若是文件，则进行相应的预览。
	 * @param {object} row 文件信息
	 * @param {number} currentIndex 当前文件索引
	 * @param {array} fileList 文件列表
	 */
	handleFileNameClick(row, currentIndex, fileList = []) {
		// 如果当前文件在回收站中，则不允许预览
		if (row.deleteFlag !== undefined && row.deleteFlag !== 0) {
			return false
		}
		// 若是文件夹则进入该文件夹
		if (row.isDir) {
			// debugger
			if (router.currentRoute.name === 'Share') {
				// 当前是查看他人分享列表的页面
				router.push({
					query: {
						filePath: `${row.shareFilePath === '/' ? '' : row.shareFilePath}/${row.fileName
							}`
					}
				})
			} else if (Number(router.currentRoute.query.fileType) === 8) {
				// 当前是我的已分享列表页面
				router.push({
					query: {
						fileType: 8,
						filePath: `${row.shareFilePath === '/' ? '' : row.shareFilePath}/${row.fileName
							}`,
						shareBatchNum: row.shareBatchNum
					}
				})
			} else if (Number(router.currentRoute.query.fileType) !== 6) {
				// 回收站页面不允许打开文件夹
				// 网盘页面
				router.push({
					query: {
						filePath: `${row.filePath === '/' ? '' : row.filePath}/${row.fileName
							}`,
						fileType: router.currentRoute.query.fileType
					}
				})
			}
		}
		// 若是文件，则进行相应的预览
		else {
			// 若当前点击项是图片
			const PIC = ['png', 'jpg', 'jpeg', 'gif', 'svg']
			if (PIC.includes(row.extendName.toLowerCase())) {
				this.handleImgPreview(currentIndex, row, fileList)
				return false
			}
			//  若当前点击项是可以使用office在线预览的
			if ([...officeFileType].includes(row.extendName.toLowerCase())) {
				this.getFileOnlineViewPathByOffice(row)
				return false
			}
			//  若当前点击项是pdf
			if (row.extendName.toLowerCase() === 'pdf') {
				window.open(this.getViewFilePath(row), '_blank')
			}
			//  若当前点击项是代码或文本文件
			let codeFileSuffix = row.extendName.toLowerCase()
			if (codeFileSuffix === 'yaml') {
				codeFileSuffix = 'yml'
			}
			// 无格式文件也可以在线编辑
			if (
				fileSuffixCodeModeMap.has(codeFileSuffix) ||
				(row.isDir === 0 && row.extendName === '')
			) {
				Vue.prototype.$openBox.codePreview({ fileInfo: row, isEdit: false })
				return false
			}
			//  若当前点击项是 markdown 文档
			if (markdownFileType.includes(row.extendName.toLowerCase())) {
				Vue.prototype.$openBox.markdownPreview({
					fileInfo: row,
					editable: false
				})
				return false
			}
			//  若当前点击项是视频mp4格式
			const VIDEO = ['mp4']
			if (VIDEO.includes(row.extendName.toLowerCase())) {
				this.handleVideoPreview(currentIndex, row, fileList)
				return false
			}
			//  若当前点击项是音频 mp3、flac 格式
			const AUDIO = ['mp3', 'flac']
			if (AUDIO.includes(row.extendName.toLowerCase())) {
				this.handleAudioPreview(currentIndex, row, fileList)
				return false
			}
		}
	},
	/**
	 * 文件名称拼接，包括文件名称 + 文件后缀
	 * @param {object} file 文件信息
	 * @param {boolean} isHighlight 是否需要展示高亮效果，默认不需要
	 * @returns {string} 完整文件名称
	 */
	getFileNameComplete(file, isHighlight = false) {
		return isHighlight === true && file.highlightFields
			? `${file.highlightFields}${file.isDir === 0 && file.extendName ? `.${file.extendName}` : ''
			}`
			: `${file.fileName}${file.isDir === 0 && file.extendName ? `.${file.extendName}` : ''
			}`
	},
	/**
	 * 文件类型
	 * @param {object} file 文件信息
	 */
	getFileType(file) {
		return file.isDir === 1
			? '文件夹'
			: file.extendName
				? file.extendName
				: '文件'
	},
	/**
	 * 获取文件分享过期状态
	 * @param {string} time 日期
	 * @returns {boolean} 是否过期
	 */
	getFileShareStatus(time) {
		if (new Date(time).getTime() > new Date().getTime()) {
			return false
		} else {
			return true
		}
	}
}

export default fileFunction
