// --------------------------  通用方法  ---------------------------
//若要显示:当前日期加时间(如:200906121200)
function currentTime() {
	var now = new Date()

	var year = now.getFullYear() //年
	var month = now.getMonth() + 1 //月
	var day = now.getDate() //日

	var hh = now.getHours() //时
	var mm = now.getMinutes() //分

	var clock = year + ''

	if (month < 10) clock += '0'

	clock += month + ''

	if (day < 10) clock += '0'

	clock += day + ''

	if (hh < 10) clock += '0'

	clock += hh + ''
	if (mm < 10) clock += '0'
	clock += mm
	return clock
}

/**
 * 判断文件个数是否为0，若为0则关闭
 * @param {*} name
 */
function closeEtIfNoDocument() {
	setTimeout(function () {
		var etApp = wps.EtApplication()
		var docs = etApp.Workbooks
		if (docs && docs.Count == 0) {
			etApp.Quit()
		}
	}, 500)
}

function activeTab() {
	wps.ribbonUI.ActivateTab('WeOfficeWPSExtTab')
}

function showOATab() {
	wps.PluginStorage.setItem('ShowOATabDocActive', pCheckIfOADoc()) //根据文件是否为OA文件来显示OA菜单
	wps.ribbonUI.Invalidate() // 刷新Ribbon自定义按钮的状态
}

function pGetParamName(data, attr) {
	var start = data.indexOf(attr)
	data = data.substring(start + attr.length)
	return data
}

/**
 * 从requst中获取文件名（确保请求中有filename这个参数）
 * @param {*} request
 * @param {*} url
 */
function pGetFileName(request, url) {
	var disposition = request.getResponseHeader('Content-Disposition')
	var filename = ''
	if (disposition && GetRequest(url) == '') {
		var matchs = disposition.match(/filename[^;\n=]*=((['"]).*?\2|[^;\n]*)/)
		if (matchs != null && matchs[1]) {
			filename = decodeURIComponent(
				matchs[1].replace('UTF-8', '').replace("'", '')
			)
		} else {
			filename = 'petro' + Date.now()
		}
	} else {
		//var filename = url.substring(url.lastIndexOf("/") + 1);
		var filename = GetRequest(url)
	}
	return filename
}

function pGetParamName(data, attr) {
	var start = data.indexOf(attr)
	data = data.substring(start + attr.length)
	return data
}

function GetRequest(url) {
	if (url.indexOf('?') != -1) {
		//判断是否有参数
		var str = url.substr(1) //从第一个字符开始 因为第0个是?号 获取所有除问号的所有符串
		strs = str.split('=') //用等号进行分隔 （因为知道只有一个参数 所以直接用等号进分隔 如果有多个参数 要用&号分隔 再用等号进行分隔）
		return strs[1] //直接弹出第一个参数 （如果有多个参数 还要进行循环的）
	} else {
		return ''
	}
}

/**
 * 获取落地文件地址
 * @param {*} url
 * @param {*} filename
 * @param {boolean} 生成随机dir
 * @returns
 */
function GetLocalFileName(url, filename, random) {
	var match = url.match(/(?<id>\d*)(\?fileName=(?<filename>.*))?$/)
	var customerdir = OACustomer.getCustomerDir('et')
	var dir =
		(customerdir || wps.Env.GetTempPath()) +
		constStrEnum.DirSeparator +
		match.groups.id
	mkdir(dir)
	if (!!filename) return dir + constStrEnum.DirSeparator + filename
	if (random) {
		dir +=
			constStrEnum.DirSeparator +
			Number(Math.random().toString().substr(3, 3) + Date.now()).toString(36)
		mkdir(dir)
	}
	return dir + constStrEnum.DirSeparator + match.groups.filename
}

/**
 * WPS下载文件到本地打开
 * @param {*} url 文件流的下载路径
 * @param {*} callback 下载后的回调
 * @param {boolean} random 是否随机 专门给printdocument用的
 */
function DownloadFile(url, fileName, random = false) {
	return new Promise((resolve, reject) => {
		var xhr = new XMLHttpRequest()

		xhr.onreadystatechange = function () {
			if (this.readyState == 4) {
				if (this.status == 200) {
					try {
						var path = GetLocalFileName(url, fileName, random)
						var sourceName = pGetFileName(this, url)
						loginfo(`下载文件[${sourceName}]完成`)
						var reader = new FileReader()
						reader.onload = function () {
							wps.FileSystem.writeAsBinaryString(path, reader.result)
							resolve(path)
						}
						reader.readAsBinaryString(xhr.response)
					} catch (err) {
						// toggleBeforeOAfterLoading()
						loginfo(err)
						reject(err)
					}
				} else {
					// toggleBeforeOAfterLoading()
					var msg = `下载文件[${fileName}]报错:${xhr.status}`
					loginfo(msg)
					reject(msg)
				}
			}
		}

		GetToken().then(function (token) {
			xhr.open('GET', url)
			xhr.setRequestHeader('Authorization', token)
			xhr.responseType = 'blob'

			xhr.send()
		})
	})
}

/**
 * WPS上传文件到服务端（业务系统可根据实际情况进行修改，为了兼容中文，服务端约定用UTF-8编码格式）
 * @param {*} strFileName 上传到服务端的文件名称（包含文件后缀）
 * @param {*} strPath 上传文件的文件路径（文件在操作系统的绝对路径）
 * @param {*} uploadPath 上传文件的服务端地址
 * @param {*} strFieldName 业务调用方自定义的一些内容可通过此字段传递，默认赋值'file'
 * @param {*} OnSuccess 上传成功后的回调
 * @param {*} OnFail 上传失败后的回调
 * @param {*} l_doc 当前操作的doc对象
 */
function UploadFile(
	strFileName,
	strPath,
	uploadPath,
	strFieldName = 'file',
	l_doc,
	OnSuccess,
	OnFail,
	OnComplated
) {
	var params = GetDocParamsValues(l_doc)
	var filename = getParamFormIndiDocxForm(params.fileInfo, 'file_name')

	//只读文档
	if (l_doc.ProtectionType == WdProtectionType.wdAllowOnlyFormFields) {
		return
	}

	var fileData = wps.FileSystem.readAsBinaryString(strPath)

	var data = new FakeFormData()
	if (params.action != null && params.action != '') {
		data.append('action', utf16ToUtf8(params.action))
	}
	if (params.trackFileName != null && params.trackFileName != '') {
		data.append('trackFileName', utf16ToUtf8(params.trackFileName))
	}
	data.append('querystring', utf16ToUtf8(params.fileInfo))

	data.append('FileName', utf16ToUtf8(filename))

	if (params.uploadParam != '' && params.uploadParam != 'undefined') {
		var arrParams = params.uploadParam.split('|')
		for (var i = 0; i < arrParams.length; i++) {
			if (arrParams[i] != '') {
				data.append(
					arrParams[i].split('=')[0],
					utf16ToUtf8(arrParams[i].split('=')[1])
				)
			}
		}
	}
	if (!strFieldName) {
		//如果业务方没定义，默认设置为'file'
		strFieldName = 'file'
	}
	data.append(strFieldName, {
		name: utf16ToUtf8(strFileName), //主要是考虑中文名的情况，服务端约定用utf-8来解码。
		type: 'application/octet-stream',
		getAsBinary: function () {
			return fileData
		},
	})

	loginfo(
		'--调用存储接口--\nfileInfo=' +
			params.fileInfo +
			'\naction=' +
			params.action +
			'\ntrackFileName=' +
			params.trackFileName
	)

	var xhr = new XMLHttpRequest()
	xhr.open('POST', uploadPath, true)
	//添加回调来刷新前端列表 青格勒 2021年4月16日
	xhr.onreadystatechange = function () {
		if (this.readyState == 4) {
			OnComplated && OnComplated()

			//接口会返回多种结构的信息
			//平台异常返回json;eq：{"message":"groupId参数格式不正确","errors":null,"code":400} httpCode为code元素
			//成功返回true|XXXXX|XXXXXXX httpCode 200
			//悲观锁异常返回 lockError|lock failure httpCode 200
			if (this.status === 200 || this.status === 0) {
				if (this.responseText.startsWith('true')) {
					OnSuccess && OnSuccess(this.response)
				} else {
					OnFail && OnFail(l_doc, this.response)
				}
			} else {
				logerr('请求错误:' + this.response)
				OnFail && OnFail(l_doc, this.response)
			}
		}
	}

	if (OnFail)
		xhr.timeout = function () {
			OnFail(l_doc, 'timeout')
		}

	GetToken().then(function (token) {
		xhr.setRequestHeader('Cache-Control', 'no-cache')
		xhr.setRequestHeader('Authorization', token)
		xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest')

		if (data.fake) {
			xhr.setRequestHeader(
				'Content-Type',
				'multipart/form-data; boundary=' + data.boundary
			)
			var arr = StringToUint8Array(data.toString())
			try {
				xhr.send(arr)
			} catch (e) {
				logerr('请求错误:' + e)
				OnFail && OnFail(this.response)
			}
		} else {
			try {
				xhr.send(data)
			} catch (e) {
				logerr('请求错误:' + e)
				OnFail && OnFail(this.response)
			}
		}
	})
}

function getParamFormIndiDocxForm(initStr, paramName) {
	if (initStr == null || initStr == '' || initStr.indexOf(paramName) < 0) {
		return ''
	}
	var startTag = '<' + paramName + '>'
	var endTag = '</' + paramName + '>'
	var value = ''
	value = initStr.split(startTag)[1]
	value = value.split(endTag)[0]
	return value
}

/**
 *
 * @param {String} params OA传递过来的字符串
 * @returns 文件名称
 */
function GetFileNameByParams(params) {
	return getParamFormIndiDocxForm(params.fileInfo, 'file_name')
}

function GetFileNameByFileInfo(fileInfo) {
	return getParamFormIndiDocxForm(fileInfo, 'file_name')
}

/**
 * 批量设置文档oa参数
 * @param {wps.document} Doc
 * @param {Object} values
 * @returns
 */
function SetDocParamsValues(Doc, values) {
	if (!Doc) {
		return
	}
	var docId = GetUniqueId(Doc)
	var l_Params = wps.PluginStorage.getItem(docId) || '{}'
	var l_objParams = JSON.parse(l_Params)
	if (!(typeof l_objParams == 'undefined')) {
		Object.keys(values).forEach((key) => {
			l_objParams[key] = values[key]
		})
	}

	//把属性值整体再写回原来的文档ID中
	wps.PluginStorage.setItem(docId, JSON.stringify(l_objParams))
}

/**
 *  设置文档参数的属性值
 * @param {*} Doc
 * @param {*} Key
 * @param {*} Value
 */
function SetDocParamsValue(Doc, Key, Value) {
	if (!Doc || !Key) {
		return
	}

	var docid = GetUniqueId(Doc)

	var l_Params = wps.PluginStorage.getItem(docid) || '{}'

	var l_objParams = JSON.parse(l_Params)
	if (!(typeof l_objParams == 'undefined')) {
		l_objParams[Key] = Value
	}

	//把属性值整体再写回原来的文档ID中
	wps.PluginStorage.setItem(docid, JSON.stringify(l_objParams))
}

/**
 * 根据传入Document对象，获取OA传入的参数的所有参数
 * @param {*} Doc
 * @param {*} Key
 * 返回值 Object
 */
function GetDocParamsValues(Doc) {
	if (!Doc) {
		return ''
	}

	var l_Params = wps.PluginStorage.getItem(GetUniqueId(Doc))
	if (!l_Params) {
		return ''
	}

	return JSON.parse(l_Params)
}

function GetCurrentDocument() {
	return wps.Application.ActiveWorkbook
}
