import querystring from 'querystring';
import { once } from './call'

const h5Base = {}

/**
 * 获取链接参数
 */
h5Base.getQueryInfo = function () {
  try {
    const search = window.location.search
    if (!search) {
      return {}
    }
    return querystring.parse(search.replace(/^\?/g, ''))
  } catch (err) {
    return {};
  }
}

/**
 * 获取链接参数，仅调用一次
 */
h5Base.getQueryOnce = once(h5Base.getQueryInfo)

/**
 * @typedef {Object} BaseInfo BaseInfo 
 * @property {string} suid 加密uid
 * @property {string} spid 加密pid
 * @property {string} gid 品类
 * @property {string} room 房间号
 * @property {string} osversion 系统版本
 * @property {string} osmode 系统模式 cef, electron
 */
/**
 * 获取基础信息
 * @returns {BaseInfo|null}
 */
h5Base.getBaseInfo = function () {
  try {
    const extExtra = window.external?.ExtExtra
    if (extExtra) {
      return extExtra
    }

    const { extextra } = h5Base.getQueryOnce()
    if (!extextra) {
      return null
    }

    // 解析
    const values = decodeURIComponent(extextra).split('|')
    return {
      suid: values[0],
      spid: values[1],
      room: values[2],
      gid: values[3],
      osversion: values[4],
      osmode: values[5]
    }
  } catch (err) {
    return null
  }
}

/**
 * 获取基础信息仅调用一次
 * @returns {BaseInfo|null}
 */
h5Base.getBaseOnce = once(h5Base.getBaseInfo)

/**
 * @typedef {Object} ExtInfo ExtInfo
 * @property {string} extType 小程序类型
 * @property {string} platform 平台
 * @property {string} extName 小程序名称
 * @property {string} extUuid 小程序ID
 * @property {string} extVersion 小程序版本
 * @property {string} extVersionId 小程序版本ID
 * @property {string} extTechType 小程序技术类型
 * @property {string} extBusiType 小程序业务类型
 * @property {string} extBuildEnv 小程序构建环境
 */
/**
 * 获取小程序信息
 * @returns {ExtInfo}
 */
h5Base.getExtInfo = function() {
  try {
    const keyMap = {
      "ext-type": "extType",
      "ext-platform": "platform",
      "ext-name": "extName",
      "ext-uuid": "extUuid",
      "ext-version": "extVersion",
      "ext-version-id": "extVersionId",
      "ext-tech-type": "extTechType",
      "ext-busi-type": "extBusiType",
      "ext-build-env": "extBuildEnv",
    }

    // 从 meta 上获取ext信息
    const temp = {}
    const metas = document.getElementsByTagName('meta');
    for (let i = 0; i < metas.length; i++) {
      const meta = metas[i]
      const key = meta && meta.name && keyMap[meta.name]
      if (key) {
        temp[key] = meta.content
      }
    }

    return temp
  } catch (err) {
    return {}
  }
}

/**
 * 获取小程序信息仅调用一次
 * @returns {ExtInfo}
 */
h5Base.getExtInfoOnce = once(h5Base.getExtInfo)

export default h5Base
