/**
 * 从OA调用传来的指令，打开本地新建文件
 * @param {*} fileUrl 文件url路径
 */
function NewFile(params) {
	//获取ET Application 对象
	var etApp = wps.EtApplication()
	wps.PluginStorage.setItem('IsInCurrOADocOpen', true) //设置OA打开文档的临时状态
	var doc = etApp.Workbooks.Add() //新增OA端文档
	wps.PluginStorage.setItem('IsInCurrOADocOpen', false)

	//检查系统临时文件目录是否能访问
	if (wps.Env && wps.Env.GetTempPath) {
		if (params.newFileName) {
			//按OA传入的文件名称保存
			doc.SaveAs(
				($FileName = wps.Env.GetTempPath() + '/' + params.newFileName),
				undefined,
				undefined,
				undefined,
				undefined,
				undefined,
				undefined,
				undefined,
				false
			)
		} else {
			//OA传入空文件名称，则保存成系统时间文件
			doc.SaveAs(
				($FileName = wps.Env.GetTempPath() + '/OA_' + currentTime()),
				undefined,
				undefined,
				undefined,
				undefined,
				undefined,
				undefined,
				undefined,
				false
			)
		}
	} else {
		alert('文档保存临时目录出错！不能保存新建文档！请联系系统开发商。')
	}

	var l_NofityURL = GetParamsValue(params, 'notifyUrl')
	if (l_NofityURL) {
		NotifyToServer(l_NofityURL.replace('{?}', '1'))
	}

	//Office文件打开后，设置该文件属性：从服务端来的OA文件
	pSetOADocumentFlag(doc, params)
	//设置当前文档为 本地磁盘落地模式
	DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc)
	//强制执行一次Activate事件
	OnWindowActivate()

	return doc //返回新创建的Document对象
}

/**
 * 打开服务器上的文件
 * @param {*} fileUrl 文件url路径
 */
function OpenFile(params) {
	var l_strFileUrl = params.fileName //来自OA网页端的OA文件下载路径
	var doc
	var l_IsOnlineDoc = false //默认打开的是不落地文档
	if (!l_strFileUrl) return
	//下载文档之前，判断是否已下载该文件
	if (pCheckIsExistOpenOADoc(l_strFileUrl) == true) {
		//如果找到相同OA地址文档，则给予提示
		wps.EtApplication().Visible = true
		//根据OA助手对是否允许再次打开相同文件的判断处理
		var l_AllowOADocReOpen = false
		l_AllowOADocReOpen = wps.PluginStorage.getItem('AllowOADocReOpen')
		if (l_AllowOADocReOpen == false) {
			alert('已打开相同的OA文件，请关闭之前的文件，再次打开。')
			wps.EtApplication().Visible = true
			return null
		} else {
			//处理重复打开相同OA 文件的方法
			var nDocCount = wps.EtApplication().Workbooks.Count
			pReOpenOADoc(l_strFileUrl)
			//重复打开的文档采用不落地的方式打开
			// 不落地方式打开文档判断落地比较多，V1版本先暂时关闭
			l_IsOnlineDoc = true
			var nDocCount_New = wps.EtApplication().Workbooks.Count
			if (nDocCount_New > nDocCount) {
				doc = wps.EtApplication().ActiveWorkbook
			}
		}
	} else {
		//如果当前没有打开文档，则另存为本地文件，再打开
		let fileName = GetFileNameByParams(params)
		DownloadFile(
			l_strFileUrl,
			fileName,
			params.action == 'printdocument' //打印文档操作保存随机路径
		)
			.then(function (path) {
				if (path == '') {
					ShowMessage(
						'从服务端下载路径：' + l_strFileUrl + '\n' + '获取文件下载失败！',
						'error'
					)
					return null
				}

				doc = pDoOpenOADocProcess(params, path)
				pOpenFile(doc, params, l_IsOnlineDoc)
			})
			.catch((msg) => {
				ShowMessage(`下载文件[${fileName}]失败!${msg}`, 'error', 5)
				OAWebNotice(fileName)
			})
	}
}

function pOpenFile(doc, params, isOnlineDoc) {
	var l_IsOnlineDoc = isOnlineDoc

	//设置当前文档为 本地磁盘落地模式
	if (l_IsOnlineDoc == true) {
		DoSetOADocLandMode(doc, EnumDocLandMode.DLM_OnlineDoc)
	} else {
		DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc)
	}

	var l_ProtectType = -1
	if (!!params.openType && params.openType.hasOwnProperty('protectType'))
		l_ProtectType = params.openType.protectType

	var l_bShowRevision = getBoolean(params.fileparam.UseMark, true) //是否显示修订记录

	if (l_ProtectType < 2 && params.action !== 'printdocument') {
		//可编辑和非打印模式下才设置心跳
		//设定心跳值
		Heart.OpendOADocument(doc)
	}

	//设置文档修订状态
	DoOADocOpenRevision(doc, l_ProtectType == 0, l_bShowRevision)

	var ps = GetDocParamsValues(doc)
	ps[constStrEnum.OriginalRsid] = ps[constStrEnum.CurrentRsid]
	SetDocParamsValues(doc, ps)

	// 触发切换窗口事件
	OnWindowActivate()
	return doc
}

function DoOADocOpenRevision(doc, bOpenRevision, bShowRevision) {
	if (!doc) return
	if (bOpenRevision) {
		wps.Application.DisplayAlerts = false
		doc.SaveAs(
			doc.FullName,
			undefined,
			undefined,
			undefined,
			undefined,
			undefined,
			2
		)
		doc.KeepChangeHistory = true
		if (bShowRevision) {
			doc.HighlightChangesOptions(2, '每个人')
			doc.ListChangesOnNewSheet = false //
			doc.HighlightChangesOnScreen = true
		}
		wps.Application.DisplayAlerts = true
	}
}

/**
 * 文档打开服务器上的文件
 * @param {*} fileUrl 文件url路径
 */
function OpenOnLineFile(OAParams) {
	//OA参数如果为空的话退出
	if (!OAParams) return

	//获取在线文档URL
	var l_OAFileUrl = OAParams.fileName
	var l_doc
	if (l_OAFileUrl) {
		//下载文档不落地（16版WPS的925后支持）
		wps.PluginStorage.setItem('IsInCurrOADocOpen', true)
		wps
			.EtApplication()
			.Workbooks.OpenFromUrl(
				l_OAFileUrl,
				'OnOpenOnLineDocSuccess',
				'OnOpenOnLineDocDownFail'
			)
		wps.PluginStorage.setItem('IsInCurrOADocOpen', false)
		l_doc = wps.EtApplication().ActiveWorkbook
	}

	//Office文件打开后，设置该文件属性：从服务端来的OA文件
	pOpenFile(l_doc, OAParams, true)
	return l_doc
}

/**
 * 打开在线文档成功后触发事件
 * @param {*} resp
 */
function OnOpenOnLineDocSuccess(resp) {}

/**
 * 作用：打开文档处理的各种过程，包含：打开带密码的文档，保护方式打开文档，修订方式打开文档等种种情况
 * params	Object	OA Web端传来的请求JSON字符串，具体参数说明看下面数据
 * TempLocalFile : 字符串 先把文档从OA系统下载并保存在Temp临时目录，这个参数指已经下载下来的本地文档地址
 * ----------------------以下是OA参数的一些具体规范名称
 * docId	String	文档ID
 * uploadPath	String	保存文档接口
 * fileName	String	获取服务器文档接口（不传即为新建空文档）
 * userName	String	用于更改显示修改人的用户名
 * buttonGroups	string	自定义按钮组 （可不传，不传显示所有按钮）
 * openType	String	文档打开方式 ，不传正常打开
 *      protectType	bool	文档保护类型，false或是未定义为不启用保护，其他为启用
 *      password	String密码
 */
var gettokenid = false
function pDoOpenOADocProcess(params, TempLocalFile) {
	var l_ProtectPassword = '6TFC$RGB' //默认文档密码为空

	var l_strDocPassword = '' //打开文档密码参数

	for (var _key in params) {
		var key = (_key || '').toUpperCase()
		switch (key) {
			case 'userName'.toUpperCase(): //修改当前文档用户名
				wps.EtApplication().UserName = params[_key]
				break
			// case 'openType'.toUpperCase():
			// 	l_ProtectType = params[_key].protectType //获取OA传来的文档保护类型
			// 	// l_ProtectPassword = params[_key].password //获取OA传来的保护模式下的文档密码
			// 	break
			case 'docPassword'.toUpperCase(): //传入打开文件的密码
				l_strDocPassword = params[_key].docPassword
				break
		}
	}

	var l_Doc = wps
		.EtApplication()
		.Workbooks.Open(TempLocalFile, false, false, undefined, l_strDocPassword)
	var l_Count = 0
	for (l_Count = 0; l_Count < l_Doc.Worksheets.Count; l_Count++) {
		l_Doc.Worksheets.Item(l_Count + 1).Unprotect(l_ProtectPassword)
	}

	//处理另存为
	var Persist = getBoolean(params.fileparam.AllowSaveAs, true)
	var ps = Object.assign(
		{
			isOA: EnumOAFlag.DocFromOA,
			SourcePath: l_Doc.FullName,
			TempLocalFile,
			Persist,
		},
		params
	)

	var l_ProtectType = -1
	if (!!params.openType && params.openType.hasOwnProperty('protectType'))
		l_ProtectType = params.openType.protectType

	//打开文档后，根据保护类型设置文档保护
	if (l_ProtectType == 2 || l_ProtectType == 1) {
		// 设置文档保护
		SetOADocProtect(l_Doc, l_ProtectPassword)
	}
	l_Doc.Save()
	SetDocParamsValues(l_Doc, ps)
	return l_Doc
}

/**
 * protectType: '', 文档保护模式
 * @param {*} ProtectPassword
 * @param {*} doc
 */
function SetOADocProtect(doc, ProtectPassword) {
	if (!doc) return //校验文档是否存在

	for (l_Count = 0; l_Count < doc.Worksheets.Count; l_Count++) {
		doc.Worksheets.Item(l_Count + 1).Protect(ProtectPassword)
	}
	return
}

/**
 *  打开在线不落地文档出现失败时，给予错误提示
 */
function OnOpenOnLineDocDownFail() {
	alert('打开在线不落地文档失败！请尝试重新打开。')
	return
}

/**
 * 功能说明：判断是否已存在来自OA的已打开的文档
 * @param {字符串} FileURL
 */
function pCheckIsExistOpenOADoc(FileURL) {
	var l_DocCount = wps.EtApplication().Workbooks.Count
	if (l_DocCount <= 0) return false

	//轮询检查当前已打开的WPS文档中，是否存在OA相同的文件
	if (l_DocCount >= 1) {
		for (var l_index = 1; l_index <= l_DocCount; l_index++) {
			var l_objDoc = wps.EtApplication().Workbooks.Item(l_index)

			var l_strParam = wps.PluginStorage.getItem(l_objDoc.FullName)
			if (l_strParam == null) continue
			var l_objParam = JSON.parse(l_strParam)
			if (l_objParam.fileName == FileURL) {
				return true
			}
		}
		return false
	}
}

/**
 * 参数：
 * doc : 当前OA文档的Document对象
 * DocLandMode ： 落地模式设置
 */
function DoSetOADocLandMode(doc, DocLandMode) {
	if (!doc) return
	var l_Param = wps.PluginStorage.getItem(doc.FullName)
	var l_objParam = JSON.parse(l_Param)
	//增加属性，或设置
	l_objParam.OADocLandMode = DocLandMode //设置OA文档的落地标志

	var l_p = JSON.stringify(l_objParam)
	//将OA文档落地模式标志存入系统变量对象保存

	wps.PluginStorage.setItem(doc.FullName, l_p)
}

//Office文件打开后，设置该文件属性：从服务端来的OA文件
function pSetOADocumentFlag(doc, params) {
	if (!doc) {
		return
	}
	var l_Param = params
	l_Param.isOA = EnumOAFlag.DocFromOA //设置OA打开文档的标志
	l_Param.SourcePath = doc.FullName //保存OA的原始文件路径，用于保存时分析，是否进行了另存为操作

	if (doc) {
		var l_p = JSON.stringify(l_Param)

		//将OA文档标志存入系统变量对象保存
		wps.PluginStorage.setItem(doc.FullName, l_p)
	}
}

/**
 * 作用：设置Ribbon工具条的按钮显示状态
 * @param {*} paramsGroups
 */
function pDoResetRibbonGroups(paramsGroups) {}
