// 打印前监听事件
function OnDocumentBeforePrint(doc) {
	return
}

//切换窗口时触发的事件
function OnWindowActivate() {
	var l_doc = wps.WpsApplication().ActiveDocument
	SetCurrDocEnvProp(l_doc) // 设置当前文档对应的用户名
	// showOATab(); // 根据文件是否为OA文件来显示OA菜单再进行刷新按钮
	if (pCheckIfOADoc()) {
		setTimeout(activeTab, 500) // 激活页面必须要页签显示出来，所以做0.5秒延迟

		wps
			.WpsApplication()
			.CommandBars.ExecuteMso('KsoEx_RevisionCommentModify_Disable')

		// wps.WpsApplication().ActiveDocument.ActiveWindow.ActivePane.View.RevisionsMode =
		// 	GetDocParamsValue(l_doc, 'RevisionsMode')

		//不允许另存为
		if (GetDocParamsValue(l_doc, 'Persist') == true) {
			wps.Application.CommandBars.SetEnabledMso('FileSaveAsMenu', true)
			wps.Application.CommandBars.SetEnabledMso('FileSaveAs', true)
		} else {
			wps.Application.CommandBars.SetEnabledMso('FileSaveAsMenu', false)
			wps.Application.CommandBars.SetEnabledMso('FileSaveAs', false)
		}
	} else {
		// wps
		// 	.WpsApplication()
		// 	.CommandBars.ExecuteMso('KsoEx_RevisionCommentModify_Enable')
		// wps.WpsApplication().ActiveDocument.ActiveWindow.ActivePane.View.RevisionsMode = 1

		wps
			.WpsApplication()
			.CommandBars.ExecuteMso('KsoEx_RevisionCommentModify_Enable')

		wps.Application.CommandBars.SetEnabledMso('FileSaveAsMenu', true)
		wps.Application.CommandBars.SetEnabledMso('FileSaveAs', true)
	}
	return
}

/**
 *  作用：判断OA文档是否被另存为了
 */
function CheckIfOADocSaveAs(doc) {
	if (!doc) {
		return
	}
	// 获取OA文档的原始保存路径
	var l_Path = GetDocParamsValue(doc, constStrEnum.SourcePath)
	// 原路径和当前文件的路径对比
	return l_Path == doc.FullName
}

// 当文件保存前触发的事件
function OnDocumentBeforeSave(doc) {
	//设置变量，判断是否当前用户按了自定义的OA文件保存按钮
	var l_IsOADocButtonSave = false
	l_IsOADocButtonSave = wps.PluginStorage.getItem(constStrEnum.OADocUserSave)

	//根据传入参数判断当前文档是否能另存为，默认不能另存为
	if (pCheckCurrOADocCanSaveAs(doc) == false) {
		//先根据OA助手的默认设置判断是否允许OA文档另存为操作
		//0.如果配置文件：OA文档不允许另存为，则再判断
		//1.先判断是否是在线文档且是通过WPS自身按钮或快捷键保存，则取消弹出另存到本地的弹出框
		if (pIsOnlineOADoc(doc) == true && l_IsOADocButtonSave == false) {
			alert('来自OA的不落地文档，禁止另存为本地文档！')
			//如果是OA文档，则禁止另存为
			wps.ApiEvent.Cancel = true
		}
		//2.如果是落地打开的OA文档并且通过WPS自身按钮或者快捷键保存，则执行保存到本地临时目录，取消弹出对话框
		if (pIsOnlineOADoc(doc) == false && l_IsOADocButtonSave == false) {
			//用户手动另存为操作时，在这里被屏蔽掉
			doc.Save()
			//如果是OA文档，则禁止另存为
			//wps.ApiEvent.Cancel = true;
		}
	}
	//保存文档后，也要刷新一下Ribbon按钮的状态
	showOATab()
	// return;

	return false
}

//文档保存前关闭事件
/**
 * 作用：
 * @param {*} doc
 */
function OnDocumentBeforeClose(doc) {
	loginfo('用户点击关闭')
	var l_bIsOADoc = false
	l_bIsOADoc = CheckIfDocIsOADoc(doc) //判断是否OA文档要关闭
	if (l_bIsOADoc == false) {
		// 非OA文档不做处理
		return
	}

	if (!Heart.GetCurrentDocs()[GetUniqueId(doc)]) {
		return
	}

	//强制取消保存，并执行OA逻辑
	wps.ApiEvent.Cancel = true

	//只读文档
	var docparams = GetDocParamsValues(doc)

	if (
		doc.ProtectionType == WdProtectionType.wdAllowOnlyFormFields ||
		doc.ProtectionType == WdProtectionType.wdAllowOnlyReading ||
		docparams.action == 'convertpdf' ||
		docparams.action == 'convertofd' ||
		docparams.action == 'printdocument' ||
		docparams.action == 'saveAs'
	) {
		clearWaterMark(doc, docparams)
		loginfo(`文件[${doc.Name}] ${docparams.action} 关闭不上传`)

		setTimeout(function () {
			Heart.CloseOADocument(doc)
			doc.Close()
		}, 100)
		return
	}

	if (
		doc.Saved == true &&
		doc.CurrentRsid == docparams[constStrEnum.OriginalRsid]
	) {
		//无任何修改
		loginfo(`文件[${doc.Name}] 无修改 关闭不上传`)
		setTimeout(function () {
			Heart.CloseOADocument(doc)
			doc.Close()
		}, 100)
		return
	}

	if (doc.Saved == false) {
		var online = Heart.IsOASystemOnline()
		ShowConfirm('是否保存并上传服务器', 'warning', {
			title: '提醒',
			btns: [
				{
					key: 'yes',
					text: '保存',
					primary: true,
					close: true,
					callback: function () {
						//手动修复window Modal阻断的情况
						if (online) Heart.OASystemOnLine()
						doc.Save()
						doc.Close()
					},
				},
				{
					key: 'no',
					text: '不保存',
					close: true,
					danger: true,
					callback: function () {
						// Heart.CloseOADocument(doc)
						doc.Saved = true
						doc.Close(WdSaveOptions.wdDoNotSaveChange)
					},
				},
				{
					key: 'cancel',
					text: '取消',
					close: true,
				},
			],
		})
		return
	}

	//检测lockfailcallback
	var lockfail = GetDocParamsValue(doc, 'LockError')
	if (!!lockfail) {
		var callback = window[lockfail.callback]
		if (callback) {
			callback(doc, lockfail.msg)
			return
		}
	}

	UploadFileToServer(doc)
}

//文档保存后关闭事件
function OnDocumentAfterClose(doc) {
	var l_bIsOADoc = false
	l_bIsOADoc = CheckIfDocIsOADoc(doc) //判断是否OA文档要关闭
	if (l_bIsOADoc == false) {
		// 非OA文档不做处理
		return
	}

	//隐藏前置
	hiddenIfNoDocument(1)
	var params = GetDocParamsValues(doc)

	var filename = getParamFormIndiDocxForm(params.fileInfo, 'file_name')
	//清空心跳记录
	Heart.CloseOADocument(doc)
	OAWebNotice(filename) //统一提醒

	var filepath = doc.FullName
	//这里wps返回返回的路径和实际保存路径的间隔符不一致，所以全部替换掉
	// var filemoved =
	// 	params.TempLocalFile.replace(/[\/\\]/gi, '') !=
	// 	filepath.replace(/[\/\\]/gi, '')
	var persistdoc = GetDocParamsValue(doc, 'Persist') == true // || filemoved

	pRemoveDocParam(doc) // 关闭文档时，移除PluginStorage对象的参数
	pSetWPSAppUserName() // 判断文档关闭后，如果系统已经没有打开的文档了，则设置回初始用户名
	setTimeout(stopRefreshToken, 1e3) //一秒之后执行清理RefreshToken

	setTimeout(() => {
		if (!persistdoc) wps.FileSystem.Remove(filepath) //删除临时文件
		wps.FileSystem.Remove(params.TempLocalFile)
		// closeWpsIfNoDocument(params)
		hiddenIfNoDocument(0)
	}, 500)
}

function stopRefreshToken() {
	if (gettokenid) {
		const docs = wps.Application.Documents
		for (let i = 0; i < docs.Count; i++) {
			const doc = docs.Item(i)
			if (CheckIfDocIsOADoc(doc)) return
		}

		//没有OA文档
		clearTimeout(gettokenid)
		gettokenid = null
	}
}

//文档打开事件
function OnDocumentOpen(doc) {
	//设置当前新增文档是否来自OA的文档
	if (wps.PluginStorage.getItem(constStrEnum.IsInCurrOADocOpen) == false) {
		//如果是用户自己在WPS环境打开文档，则设置非OA文档标识
		pSetNoneOADocFlag(doc)
	}
	OnWindowActivate()
	ChangeOATabOnDocOpen() //打开文档后，默认打开Tab页
}

//新建文档事件
function OnDocumentNew(doc) {
	//设置当前新增文档是否来自OA的文档
	if (wps.PluginStorage.getItem(constStrEnum.IsInCurrOADocOpen) == false) {
		//如果是用户自己在WPS环境打开文档，则设置非OA文档标识
		pSetNoneOADocFlag(doc)
	}
	ChangeOATabOnDocOpen() // 打开OA助手Tab菜单页
	wps.ribbonUI.Invalidate() // 刷新Ribbon按钮的状态
}

/**
 *  作用：根据当前活动文档的情况判断，当前文档适用的系统参数，例如：当前文档对应的用户名称等
 */
function SetCurrDocEnvProp(doc) {
	if (!doc) return
	var l_bIsOADoc = false
	l_bIsOADoc = pCheckIfOADoc(doc)

	//如果是OA文件，则按OA传来的用户名设置WPS   OA助手WPS用户名设置按钮冲突
	if (l_bIsOADoc == true) {
		var l_userName = GetDocParamsValue(doc, constStrEnum.userName)
		if (l_userName != '') {
			wps.WpsApplication().UserName = l_userName
			return
		}
	}
	//如果是非OA文件或者参数的值是空值，则按WPS安装默认用户名设置
	wps.WpsApplication().UserName = wps.PluginStorage.getItem(
		constStrEnum.WPSInitUserName
	)
}

/*
	入口参数：doc
	功能说明：判断当前文档是否能另存为本地文件
	返回值：布尔值true or false
*/
function pCheckCurrOADocCanSaveAs(doc) {
	//如果是非OA文档，则允许另存为
	if (CheckIfDocIsOADoc(doc) == false) return true

	//对于来自OA系统的文档，则获取该文档对应的属性参数
	var l_CanSaveAs = GetDocParamsValue(doc, constStrEnum.CanSaveAs)

	//判断OA传入的参数
	if (typeof l_CanSaveAs == 'boolean') {
		return l_CanSaveAs
	}
	return false
}

/**
 * 作用：判断文档关闭后，如果系统已经没有打开的文档了，则设置回初始用户名
 */
function pSetWPSAppUserName() {
	//文档全部关闭的情况下，把WPS初始启动的用户名设置回去
	if (wps.WpsApplication().Documents.Count == 1) {
		var l_strUserName = wps.PluginStorage.getItem(constStrEnum.WPSInitUserName)
		wps.WpsApplication().UserName = l_strUserName
	}
}

/**
 * 作用：文档关闭后，删除对应的PluginStorage内的参数信息
 * 返回值：没有返回值
 * @param {*} doc
 */
function pRemoveDocParam(doc) {
	if (!doc) return
	wps.PluginStorage.removeItem(GetUniqueId(doc))
	return
}

/**
 * 作用：判断当前文档是否从OA来的文档，如果非OA文档（就是本地新建或打开的文档，则设置EnumOAFlag 标识）
 * 作用：设置非OA文档的标识状态
 * @param {*} doc
 * 返回值：无
 */
function pSetNoneOADocFlag(doc) {
	if (!doc) return
	// var l_param = wps.PluginStorage.getItem(doc.DocID); //定义JSON文档参数
	// var l_objParams = new Object();
	// if (l_param) {
	//   l_objParams = JSON.parse(l_param);
	// }
	// l_objParams.isOA = EnumOAFlag.DocFromNoOA; // 新增非OA打开文档属性
	// wps.PluginStorage.setItem(doc.DocID, JSON.stringify(l_objParams)); // 存入内存中

	SetDocParamsValue(doc, 'isOA', EnumOAFlag.DocFromNoOA)
}

/**
 * 作用：根据设置判断打开文件是否默认激活OA助手工具Tab菜单
 * 返回值：无
 */
function ChangeOATabOnDocOpen() {
	var l_ShowOATab = true //默认打开
	l_ShowOATab = wps.PluginStorage.getItem(constStrEnum.ShowOATabDocActive)

	if (l_ShowOATab == true) {
		wps.ribbonUI.ActivateTab('WeOfficeWPSExtTab') //新建文档时，自动切换到OA助手状态
	}
}
