var EnumOAFlag = {
	DocFromOA: 1,
	DocFromNoOA: 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
	}
	OnJSWorkInit() //初始化文档事件(全局参数,挂载监听事件)
	// activeTab(); // 激活OA助手菜单

	if (!IsWindows()) {
		constStrEnum.DirSeparator = '/'
	}
	return true
}

//文档各类初始化工作（WPS Js环境）
function OnJSWorkInit() {
	pInitParameters() //OA助手环境的所有配置控制的初始化过程
	AddWorkbookEvent() //挂接文档事件处理函数
}

//初始化全局参数
function pInitParameters() {
	var l_wpsUserName = wps.Application.UserName
	wps.PluginStorage.setItem('WPSInitUserName', l_wpsUserName) //在OA助手加载前，先保存用户原有的WPS应用用户名称

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

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

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

//挂载WPS的表格事件
function AddWorkbookEvent() {
	wps.ApiEvent.AddApiEventListener('WindowActivate', OnWindowActivate)
	wps.ApiEvent.AddApiEventListener('WorkbookBeforeClose', OnWorkbookBeforeClose)
	wps.ApiEvent.AddApiEventListener('WorkbookBeforeSave', OnWorkbookBeforeSave)
	wps.ApiEvent.AddApiEventListener('WorkbookOpen', OnWorkbookOpen)
}

/**
 * 根据传入Document对象，获取OA传入的参数的某个Key值的Value
 * @param {*} Doc
 * @param {*} Key
 * 返回值：返回指定 Key的 Value
 */
function GetDocParamsValue(Doc, Key) {
	if (!Doc) {
		return ''
	}

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

	var l_objParams = JSON.parse(l_Params)
	if (typeof l_objParams == 'undefined') {
		return ''
	}

	var l_rtnValue = l_objParams[Key]
	if (typeof l_rtnValue == 'undefined' || l_rtnValue == null) {
		return ''
	}
	return l_rtnValue
}

/**
 *  作用：根据OA传入参数，设置是否显示Ribbob按钮组
 *  参数：CtrlID 是OnGetVisible 传入的Ribbob控件的ID值
 */
function pShowRibbonGroupByOADocParam(CtrlID) {
	var l_Doc = wps.EtApplication().ActiveWorkbook
	if (!l_Doc) {
		return false //如果未装入文档，则设置OA助手按钮组不可见
	}

	//获取OA传入的按钮组参数组
	var l_grpButtonParams = GetDocParamsValue(l_Doc, 'buttonGroups') //disableBtns
	l_grpButtonParams =
		l_grpButtonParams + ',' + GetDocParamsValue(l_Doc, 'disableBtns')
	// 要求OA传入控制自定义按钮显示的参数为字符串 中间用 , 分隔开
	if (typeof l_grpButtonParams == 'string') {
		var l_arrayGroup = new Array()
		l_arrayGroup = l_grpButtonParams.split(',')
		//console.log(l_grpButtonParams);

		// 判断当前按钮是否存在于数组
		if (l_arrayGroup.indexOf(CtrlID) >= 0) {
			return false
		}
	}
	// 添加OA菜单判断
	if (CtrlID == 'WeOfficeWPSExtTab') {
		var l_value = wps.PluginStorage.getItem('ShowOATabDocActive')
		wps.PluginStorage.setItem('ShowOATabDocActive', false) //初始化临时状态变量
		console.log('菜单：' + l_value)
		return l_value
	}

	//disableBtns

	return true
}

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

	return
}

/**
 * 上传失败回调
 * @param {document} doc
 * @param {response} rps
 * @param {boolean} savetmp 是否保存临时文件
 */
function OnUploadFileFail(doc, rps, savetmp = true) {
	//同步操作会把wps卡死
	setTimeout(() => {
		CloseLoading(GetUniqueId(doc))
		if (rps.startWith('lockError')) {
			if (savetmp) {
				var gs = doc.Name.match(/^(?<name>.*)\.(?<ext>\w+)$/).groups
				var sourcename = doc.FullName
				var bkname =
					wps.Env.GetHomePath() +
					GetDirSpacer() +
					gs.name +
					'_锁异常临时备份' +
					'.' +
					gs.ext
				var data = wps.FileSystem.readAsBinaryString(sourcename)
				wps.FileSystem.writeAsBinaryString(bkname, data)
			}
			var failMsg = rps.split(',')
			var name = decodeURIComponent(failMsg[1]) || '未知'
			var msg = `文件已被 ${name} 编辑，无法继续提交，请确认是否关闭？`
			ShowConfirm(msg, 'error', {
				title: '提交失败',
				btns: [
					{
						key: 'close',
						text: '确认',
						primary: true,
						callback: function () {
							Heart.CloseOADocument(doc)
							doc.Close()
						},
					},
					{
						key: 'cancel',
						text: '取消',
						callback: function () {
							SetDocParamsValue(doc, 'LockError', {
								callback: 'AfterLockError',
								msg,
							})
						},
					},
				],
			})
		} else {
			ShowMessage('上传文件失败！请联系管理员', 'error')
		}
		logerr('上传失败：')
		logerr(rps)
	}, 1000)
}

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

//根据传入的doc对象，判断当前文档是否是OA文档
function CheckIfDocIsOADoc(doc) {
	if (!doc) {
		return false
	}
	var l_isOA = GetDocParamsValue(doc, 'isOA')
	if (l_isOA == '') {
		return false
	}
	return l_isOA == EnumOAFlag.DocFromOA ? true : false
}

//返回是否可以点击OA保存按钮的状态
function OnSetSaveToOAEnable() {
	return pCheckIfOADoc()
}

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

//保存到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 //默认文件名称就是当前文件编辑名称
	}

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

	if (pIsOnlineOADoc(l_doc) == false) {
		//落地文档，调用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')

						//清空心跳记录
						Heart.CloseOADocument(l_doc)
						OnUploadToServerSuccess(rps)
						l_doc.Close()
					}, 1000)
				},
				OnUploadFileFail,
				OnUploadToServerSuccess
			)
		} catch (err) {
			alert('上传文件失败！请检查系统上传参数及网络环境！')
		}
	} else {
		// 不落地的文档，调用 Document 对象的不落地上传方法
		wps.PluginStorage.setItem('OADocUserSave', EnumDocSaveFlag.OADocSave)
		try {
			//调用不落地上传方法
			l_doc.SaveAsUrl(
				l_UploadName,
				l_uploadPath,
				l_FieldName,
				'OnUploadToServerSuccess',
				'OnUploadToServerFail'
			)
		} catch (err) {
			alert('上传文件失败！请检查系统上传参数及网络环境，重新上传。')
		}
		wps.PluginStorage.setItem('OADocUserSave', EnumDocSaveFlag.NoneOADocSave)
	}
	return
}

/**
 *  执行另存为本地文件操作
 */
function OnBtnSaveAsLocalFile() {
	//初始化临时状态值
	wps.PluginStorage.setItem('OADocUserSave', false)
	wps.PluginStorage.setItem('IsInCurrOADocSaveAs', false)

	//检测是否有文档正在处理
	var l_doc = wps.EtApplication().ActiveWorkbook
	if (!l_doc) {
		alert('WPS当前没有可操作文档！')
		return
	}

	// 设置WPS文档对话框 2 FileDialogType:=msoFileDialogSaveAs
	var l_ksoFileDialog = wps.EtApplication().FileDialog(2)
	l_ksoFileDialog.InitialFileName = l_doc.Name //文档名称

	if (l_ksoFileDialog.Show() == -1) {
		// -1 代表确认按钮
		wps.PluginStorage.setItem('OADocUserSave', true) //设置保存为临时状态，在Save事件中避免OA禁止另存为对话框
		l_ksoFileDialog.Execute() //会触发保存文档的监听函数

		pSetNoneOADocFlag(l_doc)
		wps.ribbonUI.Invalidate() //刷新Ribbon的状态
	}
}

/**
 *
 * @param {*} params
 * @param {*} Key
 */
function GetParamsValue(Params, Key) {
	if (typeof Params == 'undefined') {
		return ''
	}

	var l_rtnValue = Params[Key]
	return l_rtnValue
}

function OnAction(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
		console.log(eleId)
	} 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
	}
	switch (eleId) {
		case 'btnRefreshVersion':
			refreshVersion()
			break
		case 'btnShowLogPane':
			ShowLogInfoDialog()
			break
		default:
			break
	}
	return true
}

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

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

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

function OnGetEnabled(control) {
	var eleId = typeof control == 'object' ? control.Id : control
	switch (eleId) {
		case 'btnSaveToServer': //保存到OA服务器的相关按钮。判断，如果非OA文件，禁止点击
			return OnSetSaveToOAEnable()
		case 'btnSaveAsFile':
			let doc = wps.EtApplication().ActiveWorkbook
			let l_Params = wps.PluginStorage.getItem(doc.FullName)
			let OADocLandMode = JSON.parse(l_Params).OADocLandMode
			return !OADocLandMode
		default:
	}
	return true
}

function OnGetVisible(control) {
	var eleId = typeof control == 'object' ? control.Id : control
	var l_value = false
	//按照 OA文档传递过来的属性进行判断
	l_value = pShowRibbonGroupByOADocParam(eleId)
	return l_value
}

function GetImage(control) {
	var eleId = typeof control == 'object' ? control.Id : control
	switch (eleId) {
		case 'btnSaveToServer': //保存到OA后台服务端
			return './icon/w_Save.png'
		case 'btnSaveAsFile': //另存为本地文件
			return './icon/w_SaveAs.png'
		default:
	}
	return './icon/c_default.png'
}

function OnGetLabel(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
	}
	switch (eleId) {
		// case 'btnLogDebugInfo':
		// 	return GetLocalDebugBtnText()
		case 'btnShowOAStatus':
			return GetOAStatusBtnText()
		default:
	}
	return ''
}

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

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