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

// 当文件保存前触发的事件
function OnWorkbookBeforeSave(doc) {
	var ps = {}
	ps[constStrEnum.CurrentRsid] = Date.now()
	SetDocParamsValues(doc, ps)
}

//这里模拟了一个afterclose
function offlineAndClose(doc) {
	Heart.CloseOADocument(doc)
	closeEtIfNoDocument()
}

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

	var docparams = GetDocParamsValues(doc)

	var filename = getParamFormIndiDocxForm(docparams.fileInfo, 'file_name')

	if (!Heart.GetCurrentDocs()[GetUniqueId(doc)]) {
		//代替afterclose
		//这种情况已经做过离线操作了，所以直接关闭wps

		OAWebNotice(filename)
		var filepath = doc.FullName

		//清理文件
		//这里wps返回返回的路径和实际保存路径的间隔符不一致，所以全部替换掉
		// var filemoved =
		// 	docparams.TempLocalFile.replace(/[\/\\]/gi, '') !=
		// 	filepath.replace(/[\/\\]/gi, '')
		var persistdoc = GetDocParamsValue(doc, 'Persist') == true // || filemoved
		setTimeout(() => {
			if (!persistdoc) wps.FileSystem.Remove(filepath) //删除临时文件
			wps.FileSystem.Remove(docparams.TempLocalFile) //linux另存为不移除原有文件，需要手动处理
			closeEtIfNoDocument()
		}, 500)

		// closeEtIfNoDocument()
		return
	}

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

	// 只读或者无变化操作不上传
	if (
		docparams.action == 'printdocument' ||
		doc.ProtectionType == WdProtectionType.wdAllowOnlyFormFields
	) {
		loginfo(`文件[${doc.Name}] ${docparams.action} 关闭不上传`)
		setTimeout(function () {
			Heart.CloseOADocument(doc)
			doc.Close()
		}, 100)
		return
	}

	if (doc.Saved) {
		if (
			docparams[constStrEnum.CurrentRsid] ==
			docparams[constStrEnum.OriginalRsid]
		) {
			loginfo(`文件[${doc.Name}] 无修改 关闭不上传`)
			setTimeout(function () {
				Heart.CloseOADocument(doc)
				doc.Close()
			}, 100)
			return
		}
	} else {
		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.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)

	// closeEtIfNoDocument() // 判断文件个数是否为0，若为0则关闭组件
}

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

	OnWindowActivate()
	ChangeOATabOnDocOpen() //打开文档后，默认打开Tab页
}

//新建文档事件
function OnWorkbookNew(doc) {
	//设置当前新增文档是否来自OA的文档
	if (wps.PluginStorage.getItem('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) {
		//不允许另存为
		if (GetDocParamsValue(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)
		}

		//禁用修订按钮
		wps.Application.CommandBars.SetEnabledMso('ReviewTrackChangesMenu', false)

		var l_userName = GetDocParamsValue(doc, 'userName')
		if (l_userName != '') {
			wps.EtApplication().UserName = l_userName
			return
		}
	} else {
		wps.Application.CommandBars.SetEnabledMso('FileSaveAsMenu', true)
		wps.Application.CommandBars.SetEnabledMso('FileSaveAs', true)

		wps.Application.CommandBars.SetEnabledMso('ReviewTrackChangesMenu', true)
	}
	//如果是非OA文件或者参数的值是空值，则按WPS安装默认用户名设置
	wps.EtApplication().UserName = wps.PluginStorage.getItem('WPSInitUserName')
}

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

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

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

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

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

/**
 * 作用：判断当前文档是否从OA来的文档，如果非OA文档（就是本地新建或打开的文档，则设置EnumOAFlag 标识）
 * 作用：设置非OA文档的标识状态
 * @param {*} doc
 * 返回值：无
 */
function pSetNoneOADocFlag(doc) {
	if (!doc) return
	var l_param = wps.PluginStorage.getItem(doc.FullName) //定义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.FullName, JSON.stringify(l_objParams)) // 存入内存中
}

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

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

/**
 * 将文件保存到服务器的逻辑
 * @param {wps.document} doc
 * @returns
 */
function UploadFileToServer(doc) {
	if (!Heart.IsOASystemOnline()) {
		ShowConfirm(
			'检测到审批单已经关闭，无法继续保存，是否另存本文档？',
			'warning',
			{
				btns: [
					{
						key: 'close',
						text: '否',
						close: true,
						callback: function () {
							Heart.CloseOADocument(doc)
							doc.Close(WdSaveOptions.wdDoNotSaveChange)
						},
					},
					{
						key: 'saveas',
						text: '是',
						primary: true,
						close: true,
						callback: function () {
							var dialog = wps.Application.FileDialog(2)
							dialog.InitialFileName = doc.FullName
							if (dialog.Show() == -1) {
								dialog.Execute()
								SetDocParamsValue(doc, 'Persist', true)
								Heart.CloseOADocument(doc)
								doc.Close()
							}
						},
					},
				],
			}
		)
		return
	}

	ShowLoading('上传中，请稍后...', GetUniqueId(doc))
	//水印不保留在文档中
	// WaterMark.ClearWaterMark(doc);
	// doc.Save();
	OnBtnSaveToServer(doc)
}
