import { defaultStorage } from '../network/defaults.mjs';

/**
 * 环境切换（test / prod）
 *
 * 设计要点：
 *   1. 仅维护 test / prod 两个环境（后续如需扩展再说）。
 *   2. 默认环境根据微信小程序/小游戏版本自动判定：
 *        - envVersion === 'release'  → 'prod'
 *        - 其他（develop / trial / 非小程序环境） → 'test'
 *   3. 用户通过 wx.__pmdSetEnv__('prod' | 'test') 手动切换后，会写入持久化存储，
 *      下次启动时优先读取存储值，不再受小程序版本影响（直到再次切换）。
 *   4. 切换后默认自动重启小游戏（wx.restartMiniProgram）/ 浏览器（location.reload），
 *      让新环境立刻生效。
 *   5. 全局调试函数优先挂到 wx 对象上（小游戏环境下 console 拿不到 globalThis），
 *      没有 wx 时回退到 globalThis。
 */
/** 默认存储 key */
var DEFAULT_ENV_STORAGE_KEY = 'pmd_api_cocos_env';
/** 默认全局调试函数名 */
var DEFAULT_GLOBAL_SET_ENV = '__pmdSetEnv__';
var DEFAULT_GLOBAL_GET_ENV = '__pmdGetEnv__';
/**
 * 读取微信小程序/小游戏当前的版本（develop / trial / release）。
 * 非小程序环境或调用失败返回 ''。
 */
function readWxEnvVersion() {
  var _a;
  var g = typeof globalThis !== 'undefined' ? globalThis : {};
  var wxObj = g.wx;
  if (!wxObj) return '';
  try {
    if (typeof wxObj.getAccountInfoSync === 'function') {
      var info = wxObj.getAccountInfoSync();
      return ((_a = info === null || info === void 0 ? void 0 : info.miniProgram) === null || _a === void 0 ? void 0 : _a.envVersion) || '';
    }
  } catch (_b) {
    /* ignore */
  }
  return '';
}
/**
 * 推断"未手动设置过环境"时的默认 env：
 *   - 小程序正式版（release） → 'prod'
 *   - 其他情况               → 'test'
 */
function inferDefaultEnv() {
  return readWxEnvVersion() === 'release' ? 'prod' : 'test';
}
/**
 * 读取当前生效的环境：
 *   - 优先读取持久化存储中的手动切换值（与 createEnvSwitcher 内部 readEnv 保持一致）
 *   - 没有持久化值时回退到 inferDefaultEnv()
 */
function readEnv() {
  var storageKey = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_ENV_STORAGE_KEY;
  var storage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultStorage;
  var v = storage.get(storageKey);
  return isValidEnv(v) ? v : inferDefaultEnv();
}
function isTestEnv() {
  var storageKey = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_ENV_STORAGE_KEY;
  var storage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultStorage;
  return readEnv(storageKey, storage) === 'test';
}
function isValidEnv(v) {
  return v === 'test' || v === 'prod';
}
function tryRestart() {
  var g = typeof globalThis !== 'undefined' ? globalThis : {};
  try {
    if (g.wx && typeof g.wx.restartMiniProgram === 'function') {
      g.wx.restartMiniProgram({});
      return;
    }
  } catch (_a) {
    /* ignore */
  }
  try {
    if (typeof g.location !== 'undefined' && typeof g.location.reload === 'function') {
      g.location.reload();
    }
  } catch (_b) {
    /* ignore */
  }
}
/**
 * 创建一个环境切换器。
 */
function createEnvSwitcher(options) {
  var _a, _b, _c;
  var storage = (_a = options.storage) !== null && _a !== void 0 ? _a : defaultStorage;
  var storageKey = (_b = options.storageKey) !== null && _b !== void 0 ? _b : DEFAULT_ENV_STORAGE_KEY;
  var autoRestartDefault = (_c = options.autoRestart) !== null && _c !== void 0 ? _c : true;
  var switcher = {
    getEnv: function getEnv() {
      return readEnv(storageKey, storage);
    },
    isTestEnv: function isTestEnv() {
      return readEnv(storageKey, storage) === 'test';
    },
    getDomain: function getDomain() {
      return options.svrdomain[readEnv(storageKey, storage)];
    },
    getBaseUrl: function getBaseUrl() {
      var domain = options.svrdomain[readEnv(storageKey, storage)] || '';
      if (domain.startsWith('https://')) {
        return domain;
      }
      return "https://".concat(domain);
    },
    setEnv: function setEnv(env, autoRestart) {
      var _a;
      if (!isValidEnv(env)) {
        console.warn("[pmd-api-cocos][env] \u975E\u6CD5\u73AF\u5883\u503C\uFF1A".concat(env, "\uFF0C\u4EC5\u652F\u6301 'test' | 'prod'"));
        return;
      }
      var prev = readEnv(storageKey, storage);
      storage.set(storageKey, env);
      var shouldRestart = autoRestart !== null && autoRestart !== void 0 ? autoRestart : autoRestartDefault;
      console.log("[pmd-api-cocos][env] \u5DF2\u5207\u6362\u5230 ".concat(env, "\uFF08\u57DF\u540D\uFF1A").concat(options.svrdomain[env], "\uFF09\uFF0C") + "".concat(shouldRestart ? '即将重启生效' : '请重启后生效'));
      try {
        (_a = options.onChange) === null || _a === void 0 ? void 0 : _a.call(options, env, prev);
      } catch (e) {
        console.warn('[pmd-api-cocos][env] onChange 回调抛错：', e);
      }
      if (shouldRestart) tryRestart();
    }
  };
  return switcher;
}

export { DEFAULT_ENV_STORAGE_KEY, DEFAULT_GLOBAL_GET_ENV, DEFAULT_GLOBAL_SET_ENV, createEnvSwitcher, inferDefaultEnv, isTestEnv, readEnv };
