import { reactive } from 'vue';
import { getNowDateTime } from '@/utils/constants';
import { ElMessage } from 'element-plus';
import { dutyOff } from '@/api/public/wex';
import { createGlobalState } from '@vueuse/core';
import { useThemeConfig } from '@/stores/themeConfig';
import { storeToRefs } from 'pinia';
import { callCenterSignOut } from '@/api/callCenter';

/**
 * @description 为了兼容不同呼叫中心 呼叫中心配置 方法
 * @return
 *     cityName: 'name', // 中文名称
 *     cityCode: 'code', // 6位区号
 *     cityAbbr: 'abbr', // 简写
 *     recordNumber: 'recordNumber', // 备案号
 *     locationCenter: [lat,lng], // 地图中心点
 *     loginBg: 'loginBg', // 登录背景
 *     isShowLogo: true, // 是否显示左上角logo
 */
// 全局变量
export const useGlobalState = createGlobalState(
	() => {
		return reactive({
			callCenterWs: <any>null,
			callCenterIsSignIn: <boolean>false,
			callCenterIsOnThePhone: <boolean>false,
			/*currentTel: useStorage('global_currentTel', {
				telNo: '', // 分机号
				jobNum: '', //工号
				telGroup: '', // 技能组ID
			}),*/
			currentTel:{
				telNo: <string | null>null, // 分机号
				jobNum: <string | null>null, //工号
				telGroup: <string | null>null, // 技能组ID
			},
		});
	},
)
const storesThemeConfig = useThemeConfig();
const { themeConfig } = storeToRefs(storesThemeConfig);
const globalState = useGlobalState();
// 发送消息
const e_TelSendMsg = (strObj: Object) => {
	// 客户端当前时间
	const nowTime = getNowDateTime();
	const strMsg = JSON.stringify(strObj);
	console.log(nowTime + ' 发送消息：' + strMsg, globalState.callCenterWs?.status);
	if (globalState.callCenterWs?.ws?.readyState === 1) {
		// 已经链接并且可以通讯，则发放文本消息
		globalState.callCenterWs?.send(strMsg);
	} else {
		ElMessage.warning({
			message: '请先签入',
			grouping: true,
		});
	}
};
/*
 * 外呼
 * ReqMakeCall - 方法名
 * Extension:分机号
 * Called：被叫
 * CustomerId：客户ID
 */
const callout = (strCallNumber: number | string) => {
	if (!strCallNumber) {
		ElMessage.error({
			message: '电话号码不能为空',
			grouping: true,
		});
		return;
	}
	const obkMsg = {
		Action: 'ReqMakeCall',
		Param: {
			Extension: globalState.currentTel.telNo,
			Called: strCallNumber,
			CustomerId: '',
		},
	};
	// 发送请求
	e_TelSendMsg(obkMsg);
};
/*
 * 签出
 * ReqAgentLogout - 签出方法名称
 * Extension - 分机号码
 */
const signOutFn = () => {
	const objMsg = {
		Action: 'ReqAgentLogout',
		Param: {
			Extension:  globalState.currentTel.telNo,
		},
	};
	// 发送请求
	e_TelSendMsg(objMsg);
	e_TelSignOut(globalState.currentTel.telNo, globalState.currentTel.telGroup);
};
/*
 * 用户分机签出（用户分机分离业务）
 */
const e_TelSignOut = async (telNo: string | null, groupId: string | null) => {
	const data = {
		telNo,
		groupId,
		telModelState: 1,
	};
	try {
		await callCenterSignOut(data);
		console.log(`${getNowDateTime()}：业务系统：签出成功`);
	} catch (e) {
		console.log(e);
	}
};
// 外呼统一调用外呼方法 兼容不同的呼叫中心
export function callCenterOutbound(phoneNumber: number | string) {
	if (!globalState.callCenterWs) {
		ElMessage.warning({
			message: '请先签入',
			grouping: true,
		});
		return;
	}
	switch (themeConfig.value.appScope) {
		case 'YiBin':
			globalState.callCenterWs?.dial(phoneNumber);
			break;
		case 'ZiGong':
		case 'LuZhou':
			callout(phoneNumber);
			break;
		default:
	}
}
// 统一调用退出登录并关闭链接方法 兼容不同的呼叫中心
export function callCenterLogout(){
	return new Promise(( resolve, reject)=>{
		if (!globalState.callCenterWs) {
			ElMessage.warning({
				message: '请先签入',
				grouping: true,
			});
			return reject();
		}
		switch (themeConfig.value.appScope) {
			case 'YiBin':
				globalState.callCenterWs?.logout();
				dutyOff(); // 呼叫中心签出
			 	return resolve(true);
			case 'ZiGong':
			case 'LuZhou':
				signOutFn();
				return resolve(true);
			default:
				return resolve(true);
		}
	})
}
