import { defineStore } from 'pinia'
import globalApi from '@/api/global'
import {
  getManufacturer,
  $XXL,
  isWebEvn,
  getVersion,
  $sleep,
  getSN,
  sys_type,
  sys_type_study_machine,
  native_api,
  isNotStudyMachine,
} from '@/utils'
import { compareVersions } from 'compare-versions'
import { userStore } from '@/stores'
import VConsole from 'vconsole'
import { XMessage } from '@/hooks'
import hud from '@/utils/hud'

interface App {
  appName: string
  iconPath: string
  pkName: string
  systemApp: 0 | 1
  versionCode: number
  versionName: string
}
interface Volume {
  musicStatus: boolean
  musicVolume: number
  effectsStatus: boolean
  effectsVolume: number
  playbackRate: number
}
interface System extends anyObj {
  device: anyObj
  volume: Volume
  isLock: boolean
  apps: App[]
  latestVersion: anyObj
  latestApkPath: string
  debug: boolean
}

const fixedPkgs = [
  'com.android.camera2',
  'com.android.calendar',
  'com.google.android.apps.nbu.files',
  'com.android.gallery3d',
  'com.android.settings',
  'com.android.calculator2',
  'com.android.deskclock',
  'com.jxw.rijiben',
  'com.jxw.classtable',
]
const blackPkgs = [
  'com.iflytek.cyber.iot.show.core',
  'cool.dmg.xuexiaole',
  'com.oirsdfg89.flg',
  'rikka.appops',
  'com.tech.translate',
  'com.study.flashplayer',
  'com.jinxin.shumeiyun.book',
  'bin.mt.plus',
]
const blackPkgPrefixes = [
  'com.gl.',
  'com.jxw',
  'com.wyt',
  'com.example',
  'air.com.wyt',
  'com.android',
  'cn.wps',
]

let vConsole: VConsole
export const globalStore = defineStore('global', () => {
  const systemDict = {
    os: '',
    device: {},
    volume: {
      musicStatus: true,
      musicVolume: 100,
      effectsStatus: true,
      effectsVolume: 100,
      playbackRate: 1,
    }, // 默认音量设置
    fullPlay: false, // 全屏播放
    isLock: false, // 锁定
    apps: [], // 应用列表
    latestVersion: {}, // 最新版本信息
    latestApkPath: '', // 最新包缓存路径
    debug: false,
  }
  const dict = ref<anyObj>([]) // 字典
  const system = reactive<System>(systemDict) // 系统配置

  // 其他应用
  const otherApps = computed(() =>
    system.apps.filter(i => {
      if (i.systemApp) return false
      // 检查是否在固定包名中
      if (fixedPkgs.includes(i.pkName)) return false
      // 检查是否在完整包名黑名单中
      if (blackPkgs.includes(i.pkName)) return false
      // 检查是否与前缀黑名单匹配
      for (const prefix of blackPkgPrefixes) {
        if (i.pkName.startsWith(prefix)) return false
      }
      // 如果不在黑名单中，保留该包
      return true
    }),
  )

  // 获取字典
  const getDict = async () => {
    const res = await globalApi.getDictionaries()
    dict.value = res.data.data
  }

  const init = async () => {
    try {
      // 获取设备信息
      if (sys_type === sys_type_study_machine) {
        // 学习机环境
        system.device = JSON.parse(native_api.getDeviceInfo()).data
        // 获取应用列表
        getApps()
        // 更新未记录的APP
        syncUnRecordApps()
      }
    } catch (err) {
      console.log(err)
    }
  }

  // 获取Apps
  const getApps = async () => {
    const res = await $XXL.getAppsInfo()
    system.apps = res
    return res
  }
  // 同步Apps
  let isSyncing = false
  const syncApps = async () => {
    if (isSyncing) return
    isSyncing = true
    try {
      const res = await getApps()
      await globalApi.updateApps({
        serialNum: getSN(),
        userAppRecords: res,
      })
    } finally {
      isSyncing = false
    }
  }
  // 同步未记录的APP
  const syncUnRecordApps = async () => {
    const apps = await getApps()
    const {
      data: { data: res },
    } = await globalApi.updateUnRecordApp({
      appInfoList: apps.map((i: App) => ({
        pkName: i.pkName,
        versionCode: i.versionCode,
      })),
    })
    if ((res?.appInfoList || []).length === 0) return
    const unApps = res.appInfoList
    const { token } = userStore()
    for (const i of unApps) {
      const app = apps.find((a: App) => a.pkName === i.pkName)
      const logoRes = await $XXL.uploadFile({
        url: `${import.meta.env.VITE_SERVER_URL}/sysFileInfo/tenUploadAll`,
        header: {
          Authorization: token,
        },
        filePath: app.iconPath,
        fileKey: 'file',
      })
      globalApi.updateAppInfo([
        {
          pkName: i.pkName,
          versionCode: i.versionCode,
          logoUrl: logoRes.url,
        },
      ])
      await $sleep(1000)
    }
  }
  // APK版本差异
  const diffApkVersion = computed(
    () =>
      compareVersions(
        String(system.latestVersion.apk?.versionNum || 0),
        String(getVersion() || 0),
      ) === 1,
  )
  // WEB版本差异
  const diffWebVersion = computed(
    () => compareVersions(String(system.latestVersion.web?.versionNum || 0), getVersion(1)) === 1,
  )
  // 检测更新
  const checkStudyMachineUpdate = async (checkWeb = true) => {
    if (isNotStudyMachine) return
    const {
      data: { data: res },
    } = await globalApi.checkVersion({
      model: getManufacturer(),
    })
    system.latestVersion = res
    if (!res) return false
    return diffApkVersion.value || (checkWeb && diffWebVersion.value)

    // if (diffApkVersion.value) {
    //     console.log('----下载APK----');
    //     await $XXL.downloadFile(
    //         {
    //             url: system.latestVersion.apk.downloadLink,
    //             rewrite: 1,
    //         },
    //         ({ data: res }, next) => {
    //             console.log('----下载进度----', res);
    //             const status = res?.c || res?.status;
    //             const path = res?.b || res?.path;
    //             if (status) {
    //                 if (res?.status === 3 || res?.status === 4) {
    //                     system.latestApkPath = path;
    //                     next();
    //                 } else if (res?.status >= 5) {
    //                     XMessage.error('下载失败');
    //                     next();
    //                 }
    //             } else if (path) {
    //                 system.latestApkPath = path;
    //                 next();
    //             }
    //         },
    //     );
    // }
    // console.log('----下载完成----');
  }

  function getUpdateText(curVersion: any, newVersion: any) {
    return `<div style="text-align:center;"><p>新版本已经准备好，马上更新</p><p style="margin:10px 0;">当前版本：${curVersion}</p><p style="color:#67C23A">最新版本：${newVersion}</p></div>`
  }

  // 展示更新提示
  function showUpdateTips() {
    $XXL.closeLoading()

    const curApkVersion = getVersion() || ''
    const curWebVersion = getVersion(1) || ''
    const curVersion = `${curApkVersion}#${curWebVersion}`
    const newApkVersion = system.latestVersion.apk?.versionNum || curApkVersion
    const newWebVersion = system.latestVersion.web?.versionNum || curWebVersion
    const newVersion = `${newApkVersion}#${newWebVersion}`
    hud.alert({
      title: '更新提示',
      content: getUpdateText(curVersion, newVersion),
      hideCancel: true,
      hideClose: true,
      okText: '马上更新',
      maskClose: false,
      ok: async () => {
        $XXL.killMyself()
      },
    })
    // useTips({
    //   title: '更新提示',
    //   html: getUpdateText(curVersion, newVersion),
    //   showCancel: false,
    //   showClose: false,
    //   zIndex: 10000,
    //   'close-on-click-modal': false,
    //   'close-on-press-escape': false,
    //   onOk: async () => {
    //     // await apkUpdate();
    //     $XXL.killMyself()
    //   },
    // })
  }

  // 记录最后一次上传应用信息时间
  // let lastUploadTime: any

  function checkUpdate() {
    if (isNotStudyMachine) {
      globalApi
        .getVersions({
          updateType: 1,
        })
        .then((res: any) => {
          const newVersion = res?.rows?.[0]?.versionNum
          if (!newVersion) return
          const curVersion = getVersion(1)
          if (compareVersions(newVersion, curVersion) !== 1) return
          hud.alert({
            title: '更新提示',
            content: getUpdateText(curVersion, newVersion),
            hideCancel: true,
            hideClose: true,
            okText: '马上更新',
            maskClose: false,
            ok: async () => {
              window.location.reload()
            },
          })
        })
    } else {
      // 检查更新
      checkStudyMachineUpdate().then(res => {
        if (!res) return
        showUpdateTips()
      })

      // 一个小时内只同步一次
      // if (lastUploadTime && dayjs().diff(lastUploadTime, 'm') < 60) return
      // 同步Apps
      // syncApps()
      // 同步未记录的Apps
      // syncUnRecordApps()
      // lastUploadTime = dayjs()
    }
  }

  // 安装新包
  const apkUpdate = async () => {
    if (isNotStudyMachine) return
    if (diffApkVersion.value) {
      if (!system.latestApkPath) return console.error('Not localPath')
      const path = system.latestApkPath
      system.latestApkPath = ''
      $XXL.clearWebViewCache()
      await $sleep(300)
      $XXL.installApk(path)
      return
    }
    if (diffWebVersion.value) {
      $XXL.forceRefresh()
    }
  }
  // 初始化开发者工具
  const initDevTool = () => {
    try {
      XMessage.success('已开启调试模式')
      system.debug = true
      if (!isWebEvn) {
        vConsole = new VConsole({ theme: 'light' })
        // showPanel && $XXL.showDebugPanel();
      }
      // PageSpy
      setTimeout(() => {
        const { userInfo } = userStore()
        window.$pageSpy = new window.PageSpy({
          title: `${userInfo ? `${userInfo.userId}-${userInfo.account}` : '未登陆'}`,
          project: getSN(),
        })
      }, 1000)
      return null
    } catch (err) {
      console.log(err)
    }
  }
  // 卸载开发者工具
  const destroyDevTool = (hidePanel = true) => {
    XMessage.success('已关闭调试模式')
    system.debug = false
    // 要先结束PageSpy 不然内存会泄露
    window.$pageSpy?.abort()
    hidePanel && $XXL.hideDebugPanel()
    // PageSpy
    setTimeout(() => {
      // window.$pageSpy?.abort();
      vConsole?.destroy()
    }, 1000)
  }

  // let noticeSocket: any;
  // let noticeSocketStatus: any;

  // const { token, auth } = storeToRefs(userStore());
  // // 清理字典数据
  // function clearData() {
  // 	dictionaries.value = [];
  // }

  // // 通知中心
  // async function initNotice() {
  // 	const PING_DATA = {
  // 		message: "ping",
  // 		type: "AUTHORIZATION",
  // 		accessToken: token.value.replace("Bearer ", ""),
  // 		connectType: "notify",
  // 	};
  // 	useWebNotification(); // 获取通知权限
  // 	init();

  // 	// 页面监听
  // 	const visibility = useDocumentVisibility();
  // 	watch(visibility, (newVal) => {
  // 		if (
  // 			newVal === "visible" &&
  // 			noticeSocketStatus === SOCKET_STATUS.OFFLINE
  // 		) {
  // 			noticeSocket?.close();
  // 			init();
  // 		}
  // 	});

  // 	function beforeInit() {
  // 		if (noticeSocketStatus > 0) return false;
  // 		if (!token.value) return false;
  // 		noticeSocket?.close(); // 关闭之前的socket
  // 		return true;
  // 	}

  // 	function init() {
  // 		if (!beforeInit()) return;

  // 		noticeSocket = useWebSocket(
  // 			`${import.meta.env.VITE_NOTIFY_WS_URL}?accessToken=${token.value}`,
  // 			{
  // 				autoReconnect: {
  // 					retries: 5,
  // 					delay: 3000,
  // 					onFailed() {
  // 						console.log("重新连接失败");
  // 					},
  // 				},
  // 				heartbeat: {
  // 					message: JSON.stringify(PING_DATA),
  // 					interval: 25000,
  // 					pongTimeout: 3000,
  // 				},
  // 				onConnected: () => {
  // 					console.log("ws已连接");
  // 					noticeSocketStatus = SOCKET_STATUS.CONNECTED;
  // 					noticeSocket.send(JSON.stringify(PING_DATA));
  // 				},
  // 				onDisconnected: () => {
  // 					console.log("ws已关闭");
  // 					noticeSocketStatus = SOCKET_STATUS.OFFLINE;
  // 				},
  // 				onError: (event) => {
  // 					console.log("ws链接错误");
  // 					console.log(event);
  // 					noticeSocketStatus = SOCKET_STATUS.OFFLINE;
  // 				},
  // 				onMessage,
  // 			}
  // 		);
  // 	}

  // 	function onMessage(ws: WebSocket, event: MessageEvent) {
  // 		const data = JSON.parse(event.data);
  // 		if (data.connectType === "notify") {
  // 			unRead.value += 1;
  // 			// // 通知
  // 			// const notifyRef = ElNotification({
  // 			// 	title: data.title,
  // 			// 	message: h(Notify, {
  // 			// 		message: data.content,
  // 			// 		path: data.jumpLink,
  // 			// 		onClick: () => {
  // 			// 			notifyRef.close();
  // 			// 			// 已读
  // 			// 			updateReadType({ id: data.messageId });
  // 			// 			unRead.value && (unRead.value -= 1);
  // 			// 			// 跳转
  // 			// 			goTo(data.jumpLink);
  // 			// 		},
  // 			// 	}),
  // 			// });
  // 			// 调用浏览器通知
  // 			if (visibility.value === "hidden") {
  // 				// const { isSupported, show, onClick } = useWebNotification({
  // 				// 	title: data.title,
  // 				// 	body: data.content,
  // 				// 	dir: "auto",
  // 				// 	lang: "zh-CN",
  // 				// 	renotify: true,
  // 				// 	tag: "message",
  // 				// });
  // 				// onClick.on((evt) => {
  // 				// 	window.focus();
  // 				// 	// 已读
  // 				// 	updateReadType({ id: data.messageId });
  // 				// 	unRead.value && (unRead.value -= 1);
  // 				// 	// 跳转
  // 				// 	goTo(data.jumpLink);
  // 				// 	notifyRef.close();
  // 				// });
  // 				// if (isSupported.value) {
  // 				// 	show();
  // 				// }
  // 			}
  // 		}
  // 	}
  // }

  // // 关闭通知监听
  // function closeNotice() {
  // 	noticeSocket?.close();
  // }

  // function goTo(link: string) {
  // 	if (!link) return;
  // 	// 私有协议内部跳转
  // 	if (link.startsWith("qyn://")) {
  // 		const path = link.split("qyn://")[1];
  // 		if (!path) return;
  // 		router.push({ name: path });
  // 	} else if (link.startsWith("qy://")) {
  // 		const path = link.split("qy://")[1];
  // 		if (!path) return;
  // 		router.push(`/${path}`);
  // 	} else {
  // 		newPage(link);
  // 	}
  // }
  const $reset = () => {
    dict.value = []
    Object.assign(system, systemDict)
  }
  return {
    dict,
    system,
    otherApps,
    diffApkVersion,
    init,
    getDict,
    getApps,
    syncApps,
    syncUnRecordApps,
    checkUpdate,
    apkUpdate,
    initDevTool,
    destroyDevTool,
    $reset,
  }
})
