import config from './config'
import { ossPolicy } from '@/services/student-prosthetics'

export default {
	isHttp(path) {
		return path.startsWith('http')
	},
	escapeHTML(a) {
		a = '' + a;
		return a.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(
			/'/g, "&apos;")
	},
	/** 
	 * @function unescapeHTML 还原html脚本 < > & " ' 
	 * @param a - 字符串 
	 */
	unescapeHTML(a) {
		a = '' + a;
		return a.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&").replace(/&quot;/g, '"').replace(
			/&apos;/g, "'")
	},
	uuid(len = 16) {
		const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
		const uuid = []

		if (len) {
			// 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位
			for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * chars.length]
		} else {
			let r
			// rfc4122标准要求返回的uuid中,某些位为固定的字符
			uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
			uuid[14] = '4'

			for (let i = 0; i < 36; i++) {
				if (!uuid[i]) {
					r = 0 | Math.random() * 16
					uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]
				}
			}
		}

		return uuid.join('')
	},
	upload(data) {
		if (data.editable) {
			return new Promise(resolve => {
				wx.editImage({
					src: data.filePath,
					success(res) {
						this.uploadFile({
							...data,
							filePath: res.tempFilePath
						}).then(res => {
							resolve(res)
						})
					}
				})
			})
		} else {
			return this.uploadFile(data)
		}
	},
	uploadFile(data) {
		return uni.uploadFile({
			url: this.isHttp(data.url) ? data.url : config.apiBaseUrl + data.url,
			name: data.name || 'file',
			formData: {
				...data.formData,
				token: uni.getStorageSync('token')
			},
			header: data.header || {},
			filePath: data.filePath
		}).then(res => {
			return JSON.parse(res)
		})
	},
	uploadCloud(data) {
		return uniCloud.uploadFile(data).then(res => {
			return res
		})
	},
	chooseAndUpload(methods, chooseParam, uploadParam, isCloud) {
		const uploadArr = []
		return this[methods](chooseParam).then(file => {
			file.filePaths.forEach((filePath, index) => {
				if (isCloud) {
					const fileArr = filePath.split('.')
					// 只在h5可用
					const fileType = file.tempFiles[index].type || 'image/png'
					const suffix = fileArr.length >= 2 ? fileArr[fileArr.length - 1] : fileType.split(
						'/')[1]

					uploadArr.push(this.uploadCloud({
						filePath,
						cloudPath: this.uuid() + '.' + suffix,
						fileType: (methods === 'chooseImage' ? 'image/' : 'video/') + suffix
					}).then(res => {
						if (res.success) {
							return {
								filePath: res.fileID
							}
						} else {
							uni.showToast({
								title: res.msg,
								icon: 'none'
							})
						}
					}))
				} else {
					uploadArr.push(this.upload({
						...uploadParam,
						filePath
					}).then(res => {
						if (res.code === 200 || res.success) {
							return res.data
						} else {
							uni.showToast({
								title: res.msg,
								icon: 'none'
							})
						}
					}))
				}
			})
			uni.showLoading({
				title: '上传中...'
			})
			return Promise.all(uploadArr).then(res => {
				uni.hideLoading()
				return res.filter(item => item)
			})
		})
	},
	chooseImage(data) {
		return uni.chooseImage({
			count: 1,
			...data
		}).then(res => {
			return res.tempFilePaths || []
		})
	},
	chooseAndUploadImage(chooseParam, uploadParam, isCloud) {
		return this.chooseAndUpload('chooseImage', chooseParam, uploadParam, isCloud)
	},
	chooseVideo(data) {
		return uni.chooseVideo({
			...data
		}).then(res => {
			return {
				filePaths: [res.tempFilePath],
				tempFiles: [res.tempFile]
			}
		})
	},
	chooseAndUploadVideo(chooseParam, uploadParam, isCloud) {
		return this.chooseAndUpload('chooseVideo', chooseParam, uploadParam, isCloud)
	},
	transferOssUrl(files = []) {
		const uploadArr = []
		files.forEach(file => {
			uploadArr.push(ossPolicy(file).then(res => {
				if (res.success) {
					const ret = res || {}
					const filePath = file?.objectUrl || ''
					const fileName = file?.file?.name || ''
					const index = file.file.name.lastIndexOf(".");
					const tmpFileName = index < 0 ? '.jpg' : fileName.substr(index,
						fileName.length - index)
					const uuidNum = this.uuid(32, 16) + tmpFileName
					const ossKey = ret.dir + uuidNum
					uni.uploadFile({
						url: ret.host,
						filePath: filePath,
						fileType: 'image',
						name: 'file',
						formData: {
							'OSSAccessKeyId': ret.accessKeyId,
							'policy': ret.policy,
							'key': ossKey,
							// 'x-oss-credential': ret['x-oss-credential'] || '',
							// 'x-oss-date': ret['x-oss-date'] || '',
							'Signature': ret['signature'] || '',
							// 'x-oss-signature-version': ret['x-oss-signature-version'] || '',
							'success_action_status': '200',
						},
						success: (res) => {
							uni.showToast({
								title: '上传成功',
								icon: 'none'
							})
						},
						fail: (err) => {
							throw new Error(err.errMsg);
						}
					})
					return {
						...file,
						fileUrl: ossKey,
						fileName: fileName || uuidNum,
						fileType: tmpFileName.substr(1, tmpFileName.length - 1)
					}
				}
			}))
		})
		uni.showLoading({
			title: '上传中...',
			mask: true
		})
		return Promise.all(uploadArr).then(res => {
			uni.hideLoading()
			return res.filter(item => item)
		})
	}
}
