var EnumOAFlag = {
	DocFromOA: 1,
	DocFromNoOA: 0,
}

//记录是否用户点击OA文件的保存按钮
var EnumDocSaveFlag = {
	OADocSave: 1,
	NoneOADocSave: 0,
}

//标识文档的落地模式 本地文档落地 0 ，不落地 1
var EnumDocLandMode = {
	DLM_LocalDoc: 0,
	DLM_OnlineDoc: 1,
}

//加载时会执行的方法
function OnWPSWorkTabLoad(ribbonUI) {
	wps.ribbonUI = ribbonUI
	if (typeof wps.Enum == 'undefined') {
		// 如果没有内置枚举值
		wps.Enum = WPS_Enum
	}

	//设定记录RSID 用于处理逻辑判断
	wps.Application.Options.StoreRSIDOnSave = true
	OnJSWorkInit() //初始化文档事件(全局参数,挂载监听事件)
	setTimeout(activeTab, 1000) // 激活OA助手菜单
	// OpenTimerRun(OnDocSaveByAutoTimer); //启动定时备份过程

	if (!IsWindows()) {
		constStrEnum.DirSeparator = '/'
	}
	// SetLocalDebug(true); 当前日志自动开启
	return true
}

//文档各类初始化工作（WPS Js环境）
function OnJSWorkInit() {
	wps.Application.ActiveWindow &&
		(wps.Application.ActiveWindow.ActivePane.View.RevisionsMode = 1)

	pInitParameters() //OA助手环境的所有配置控制的初始化过程
	AddDocumentEvent() //挂接文档事件处理函数
}

//初始化全局参数
function pInitParameters() {
	wps.PluginStorage.setItem(
		constStrEnum.OADocUserSave,
		EnumDocSaveFlag.NoneOADocSave
	) //初始化，没有用户点击保存按钮

	var l_wpsUserName = wps.WpsApplication().UserName
	wps.PluginStorage.setItem(constStrEnum.WPSInitUserName, l_wpsUserName) //在OA助手加载前，先保存用户原有的WPS应用用户名称

	wps.PluginStorage.setItem(constStrEnum.OADocCanSaveAs, false) //默认OA文档不能另存为本地
	wps.PluginStorage.setItem(constStrEnum.AllowOADocReOpen, false) //设置是否允许来自OA的文件再次被打开
	wps.PluginStorage.setItem(constStrEnum.ShowOATabDocActive, false) //设置新打开文档是否默认显示OA助手菜单Tab  默认为false

	wps.PluginStorage.setItem(constStrEnum.DefaultUploadFieldName, 'file') //针对UploadFile方法设置上载字段名称

	wps.PluginStorage.setItem(constStrEnum.AutoSaveToServerTime, '10') //自动保存回OA服务端的时间间隔。如果设置0，则关闭，最小设置3分钟
	wps.PluginStorage.setItem(constStrEnum.TempTimerID, '0') //临时值，用于保存计时器ID的临时值

	// 以下是一些临时状态参数，用于打开文档等的状态判断
	wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocOpen, false) //用于执行来自OA端的新建或打开文档时的状态
	wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocSaveAs, false) //用于执行来自OA端的文档另存为本地的状态
}

//挂载WPS的文档事件
function AddDocumentEvent() {
	wps.ApiEvent.AddApiEventListener('WindowActivate', OnWindowActivate)
	// wps.ApiEvent.AddApiEventListener('DocumentBeforeSave', OnDocumentBeforeSave)
	wps.ApiEvent.AddApiEventListener('DocumentBeforeClose', OnDocumentBeforeClose)
	wps.ApiEvent.AddApiEventListener('DocumentAfterClose', OnDocumentAfterClose)
	// wps.ApiEvent.AddApiEventListener(
	//   "DocumentBeforePrint",
	//   OnDocumentBeforePrint
	// );
	wps.ApiEvent.AddApiEventListener('DocumentOpen', OnDocumentOpen)
	// wps.ApiEvent.AddApiEventListener("DocumentNew", OnDocumentNew);
}

/**
 * 作用： 把当前文档保存为其他格式的文档并上传
 * @param {*} p_FileSuffix 输出的目标格式后缀名，支持：.pdf .uof .uot .ofd
 * @param {*} pShowPrompt 是否弹出用户确认框
 */
function OnDoChangeToOtherDocFormat(p_FileSuffix, pShowPrompt) {
	var l_suffix = p_FileSuffix // params.suffix;
	if (!l_suffix) {
		return
	}
	//获取当前执行格式转换操作的文档
	var l_doc = wps.WpsApplication().ActiveDocument
	if (!l_doc) {
		return
	}
	if (typeof pShowPrompt == 'undefined') {
		// pShowPrompt = true; //默认设置为弹出用户确认框
		pShowPrompt = false //默认不弹出用户确认
	}
	//默认设置为以当前文件的显示模式输出，即当前为修订则输出带有修订痕迹的
	pDoChangeToOtherDocFormat(l_doc, l_suffix, pShowPrompt, true)
}

/**
 * 作用：把当前文档输出为另外的格式保存
 * @param {*} p_Doc 文档对象
 * @param {*} p_Suffix 另存为的目标文件格式
 * @param {*} pShowPrompt 是否弹出用户确认框
 * @param {*} p_ShowRevision :是否强制关闭修订，如果是False，则强制关闭痕迹显示。如果为true则不做控制输出。
 */
function pDoChangeToOtherDocFormat(
	p_Doc,
	p_Suffix,
	pShowPrompt,
	p_ShowRevision
) {
	if (!p_Doc) {
		return
	}

	var l_suffix = p_Suffix
	//获取该文档对应OA参数的上载路径
	var l_uploadPath = GetDocParamsValue(p_Doc, constStrEnum.uploadAppendPath)
	if (l_uploadPath == '' || l_uploadPath == null) {
		l_uploadPath = GetDocParamsValue(p_Doc, constStrEnum.uploadPath)
	}
	var l_FieldName = GetDocParamsValue(p_Doc, constStrEnum.uploadFieldName)
	if (l_FieldName == '') {
		l_FieldName = wps.PluginStorage.getItem(constStrEnum.DefaultUploadFieldName) //默认是'file'
	}

	if (l_uploadPath == '' && pShowPrompt == true) {
		ShowMessage('系统未传入有效上载文件路径！不能继续转换操作。', 'error') //如果OA未传入上载路径，则给予提示
		return
	}

	//已经设置成默认不提醒无需替换ShowConfirm
	if (pShowPrompt == true) {
		if (
			!wps.confirm(
				'当前文档将另存一份' +
					l_suffix +
					' 格式的副本，并上传到系统后台，请确认 ？'
			)
		) {
			return
		}
	}

	// 先把文档输出保存为指定的文件格式，再上传到后台
	wps.PluginStorage.setItem(constStrEnum.OADocUserSave, true) //设置一个临时变量，用于在BeforeSave事件中判断
	if (p_ShowRevision == false) {
		// 强制关闭痕迹显示
		var l_SourceName = p_Doc.FullName
		l_NewName = p_Doc.Path + '\\B_' + p_Doc.Name
		p_Doc.SaveAs2(($FileName = l_NewName), ($AddToRecentFiles = false))
		p_Doc.SaveAs2(($FileName = l_SourceName), ($AddToRecentFiles = false))

		//以下以隐藏模式打开另一个文档
		var l_textEncoding = wps.WpsApplication().Options.DefaultTextEncoding //默认 936
		var l_Doc = wps
			.WpsApplication()
			.Documents.Open(
				l_NewName,
				false,
				false,
				false,
				'',
				'',
				false,
				'',
				'',
				0,
				l_textEncoding,
				false
			)

		l_Doc.TrackRevision = false //关闭修订模式
		l_Doc.ShowRevision = false //隐含属性，隐藏修订模式
		l_Doc.AcceptAllRevisions()
		l_Doc.Save()
		handleFileAndUpload(l_suffix, l_Doc, l_uploadPath, l_FieldName)
		l_Doc.Close()
		wps.FileSystem.Remove(l_NewName) //删除临时文档
	} else {
		handleFileAndUpload(l_suffix, p_Doc, l_uploadPath, l_FieldName)
	}

	wps.PluginStorage.setItem(constStrEnum.OADocUserSave, false)

	return
}

//保存到OA后台服务器
function OnBtnSaveToServer(l_doc) {
	var params = GetDocParamsValues(l_doc)
	var l_uploadPath = params[constStrEnum.uploadPath] // 文件上载路径
	if (!l_uploadPath) {
		return
	}

	var l_FieldName = params[constStrEnum.uploadFieldName] //上载到后台的业务方自定义的字段名称
	if (!l_FieldName) {
		l_FieldName = wps.PluginStorage.getItem(constStrEnum.DefaultUploadFieldName) // 默认为‘file’
	}

	var l_UploadName = params[constStrEnum.uploadFileName] //设置OA传入的文件名称参数
	if (!l_UploadName) {
		//l_UploadName = l_doc.Name //默认文件名称就是当前文件编辑名称
		//默认使用xml中定义的文件名 因为目前uploadFileName前端并没有传
		l_UploadName = GetFileNameByParams(params)
	}
	if (params.action == 'taoda' && !!params.oldDocName)
		l_UploadName = params.oldDocName

	var l_DocPath = l_doc.FullName // 文件所在路径

	loginfo('去水印')
	clearWaterMark(l_doc, params)
	loginfo('去水印完成')

	if (pIsOnlineOADoc(l_doc) == false) {
		//对于本地磁盘文件上传OA，先用Save方法保存后，再上传
		//设置用户保存按钮标志，避免出现禁止OA文件保存的干扰信息
		wps.PluginStorage.setItem(
			constStrEnum.OADocUserSave,
			EnumDocSaveFlag.OADocSave
		)
		loginfo('保存文件' + l_UploadName)
		// l_doc.Saved = false

		l_doc.Saved = false
		l_doc.Save() //执行一次保存方法
		loginfo('保存文件完成' + l_UploadName)
		//设置用户保存按钮标志
		wps.PluginStorage.setItem(
			constStrEnum.OADocUserSave,
			EnumDocSaveFlag.NoneOADocSave
		)
		//落地文档，调用UploadFile方法上传到OA后台
		try {
			//调用OA助手的上传方法
			UploadFile(
				l_UploadName,
				l_DocPath,
				l_uploadPath,
				l_FieldName,
				l_doc,
				function (rps) {
					//延时执行，因为显示loading的页面可能还没有加载完成，注册回调事件。
					//这样loading页窗体就会无法消失
					setTimeout(function () {
						CloseLoading(GetUniqueId(l_doc))
						ShowMessage('上传成功', 'success', 1, true)

						//清空心跳记录
						Heart.CloseOADocument(l_doc)
						OnUploadToServerSuccess(rps)

						hiddenIfNoDocument(1)

						setTimeout(function () {
							l_doc.Close()
						}, 2e2)
					}, 200)
				},
				OnUploadFileFail
			)
		} catch (err) {
			CloseLoading(GetUniqueId(l_doc))
			ShowMessage('上传文件失败！请联系管理员', 'error')
			logerr('上传失败：')
			logerr(rps)
		}
	} else {
		// 不落地的文档，调用 Document 对象的不落地上传方法
		wps.PluginStorage.setItem(
			constStrEnum.OADocUserSave,
			EnumDocSaveFlag.OADocSave
		)
		try {
			//调用不落地上传方法
			l_doc.SaveAsUrl(
				l_UploadName,
				l_uploadPath,
				l_FieldName,
				'OnUploadToServerSuccess',
				'OnUploadToServerFail'
			)
		} catch (err) {
			alert('上传文件失败！请检查系统上传参数及网络环境，重新上传。')
		}
		wps.PluginStorage.setItem(
			constStrEnum.OADocUserSave,
			EnumDocSaveFlag.NoneOADocSave
		)
	}

	//获取OA传入的 转其他格式上传属性
	//var l_suffix = GetDocParamsValue(l_doc, constStrEnum.suffix);
	//if (l_suffix == "") {
	//onsole.log("上传需转换的文件后缀名错误，无法进行转换上传!");
	// return;
	//}

	//判断是否同时上传PDF等格式到OA后台
	var l_uploadWithAppendPath = GetDocParamsValue(
		l_doc,
		constStrEnum.uploadWithAppendPath
	) //标识是否同时上传suffix格式的文档
	if (l_uploadWithAppendPath == '1') {
		//调用转pdf格式函数，强制关闭转换修订痕迹，不弹出用户确认的对话框
		pDoChangeToOtherDocFormat(l_doc, l_suffix, false, false)
	}
}

/**
 * 锁异常后，二次提示操作
 * @param {document} doc
 * @param {msg} msg
 */
function AfterLockError(doc, msg) {
	ShowConfirm(msg, 'warning', {
		title: '无法提交',
		btns: [
			{
				key: 'close',
				text: '确认',
				primary: true,
				callback: function () {
					Heart.CloseOADocument(doc)
					doc.Close()
				},
			},
			{
				key: 'cancel',
				text: '取消',
			},
		],
	})
}

/**
 * 调用文件上传到OA服务端时，
 * @param {*} resp
 */
function OnUploadToServerSuccess(resp) {
	loginfo('成功上传服务端后的回调：' + resp)

	return
}

function OnUploadToServerFail(resp) {
	alert('文件上传失败！')
}

//判断当前文档是否是OA文档
function pCheckIfOADoc() {
	var doc = wps.WpsApplication().ActiveDocument
	if (!doc) return false
	return CheckIfDocIsOADoc(doc)
}

//根据传入的doc对象，判断当前文档是否是OA文档
function CheckIfDocIsOADoc(doc) {
	if (!doc) {
		return false
	}

	var l_isOA = GetDocParamsValue(doc, constStrEnum.isOA)
	if (l_isOA == '') {
		return false
	}

	return l_isOA == EnumOAFlag.DocFromOA ? true : false
}

/**
 * 作用：判断是否是不落地文档
 * 参数：doc 文档对象
 * 返回值： 布尔值
 */
function pIsOnlineOADoc(doc) {
	var l_LandMode = GetDocParamsValue(doc, constStrEnum.OADocLandMode) //获取文档落地模式
	if (l_LandMode == '') {
		//用户本地打开的文档
		return false
	}
	return l_LandMode == EnumDocLandMode.DLM_OnlineDoc
}

//自定义菜单按钮的点击执行事件
function OnAction(control) {
	switch (getControlId(control)) {
		case 'btnRefreshVersion':
			refreshVersion()
			break
		case 'btnShowLogPane':
			ShowLogInfoDialog()
			break
		default:
			break
	}
	return true
}

function getControlId(control) {
	var eleId
	if (typeof control == 'object' && arguments.length == 1) {
		//针对Ribbon的按钮的
		eleId = control.Id
	} else if (typeof control == 'undefined' && arguments.length > 1) {
		//针对idMso的
		eleId = arguments[1].Id
	} else if (typeof control == 'boolean' && arguments.length > 1) {
		//针对checkbox的
		eleId = arguments[1].Id
	} else if (typeof control == 'number' && arguments.length > 1) {
		//针对combox的
		eleId = arguments[2].Id
	}
	return eleId
}

//xml文件中自定义按钮的文字处理函数
function OnGetLabel(control) {
	switch (getControlId(control)) {
		// case 'btnLogDebugInfo':
		// 	return GetLocalDebugBtnText()
		case 'btnShowOAStatus':
			return GetOAStatusBtnText()
		default:
	}
	return ''
}

function GetOAStatusBtnText() {
	if (Heart) {
		if (Heart.IsOASystemOnline(false)) {
			return '系统在线'
		} else {
			return '系统离线'
		}
	}
	return '未知'
}

/**
 * 刷新加载项
 */
function refreshVersion() {
	alert('更新加载项后请重新打开WPS')
}

function GetLocalDebugBtnText() {
	if (IfLocalDebugInfo()) return '开启本地日志' + Date.now()
	else return '关闭本地日志' + Date.now()
}

function GetVersionText() {
	return `当前版本:${GetCurrentVersion()}`
}

function ShowLogInfoDialog() {
	wps.ShowDialog(
		GetResourcePath() + 'share/ui/loginfo.html',
		'本地日志',
		600 * window.devicePixelRatio,
		600 * window.devicePixelRatio,
		false
	)
}

function ShowTabPane() {
	let taskPane = wps.CreateTaskPane(GetUrlPath() + '/ui/taskpane.html')
	taskPane.Title = 'IndiDocx'
	taskPane.DockPosition = wps.Enum.JSKsoEnum_msoCTPDockPositionLeft
	taskPane.Visible = true
}

/********     自定义功能           *********/
function getTitle() {
	var defaultTitle = 'Indidocx'
	var customertitle = OACustomer.getCustomerTitle('word')
	return customertitle || defaultTitle
}

function getCusBtnVisiable(control) {
	var id = getControlId(control)
	if (id.indexOf('cbn') == -1) return false
	var btn = OACustomer.getCustomerBtn('word', id.substr(3))
	return !!btn
}

function getCusBtnIcon(control) {
	var id = getControlId(control)
	if (id.indexOf('cbn') == -1) return ''
	var btn = OACustomer.getCustomerBtn('word', id.substr(3))
	return !!btn ? btn.getIcon() : ''
}

function getCusBtnLabel(control) {
	var id = getControlId(control)
	if (id.indexOf('cbn') == -1) return false
	var btn = OACustomer.getCustomerBtn('word', id.substr(3))
	return !!btn ? btn.getLabel() : ''
}

function onCusBtnAction(control) {
	var id = getControlId(control)
	if (id.indexOf('cbn') == -1) return false
	var btn = OACustomer.getCustomerBtn('word', id.substr(3))
	if (!!btn) btn.onAction()
	wps.ribbonUI.Invalidate()
	return true
}
