import { createEnvSwitcher } from '../env/env.mjs';
import { loginMp } from '../login/login.mjs';
import { NetworkManager } from '../manager/manager.mjs';
import { cocosLoginDecorator } from './decorators/cocos-login-decorator.mjs';
import { defaultStorage, defaultGetLoginCode } from './defaults.mjs';
import { NetworkEngine } from './engine.mjs';
import { CocosHostInterceptor } from './interceptors/request/cocos-host-interceptor.mjs';
import { CocosLoginInfoParamInterceptor } from './interceptors/request/cocos-login-info-param-interceptor.mjs';
export { COCOS_LOGIN_INFO_STORAGE_KEY } from './interceptors/request/cocos-login-info-param-interceptor.mjs';
import { GetDataInterceptor } from './interceptors/response/get-data-interceptor.mjs';
import { NormalizeResponseRetInterceptor } from './interceptors/response/normalize-response-ret-interceptor.mjs';
import '../../e-bus/init.mjs';
import '../../e-bus/e-bus.mjs';
import '@babel/runtime/helpers/classCallCheck';
import '@babel/runtime/helpers/createClass';
import '../../url/helper.mjs';
import '@babel/runtime/helpers/slicedToArray';
import './config.mjs';
import './request/cocos-request.mjs';
import '@babel/runtime/helpers/typeof';

/**
 * 一键初始化 Cocos 微信小游戏网络层
 *
 * 等价于 pmd-npm `business/src/network-v2/application/cocos/index-mp.ts`
 * 的 initNetworkManager，但适配到本包自带的 NetworkManager 和 wx.request。
 *
 * 调用一次后，所有通过 pmd-api-cocos 的 NetworkManager 发出的请求
 * 都会：
 *   - 自动拼 baseUrl + host
 *   - 无登录态时带 code → 触发后台换登录态
 *   - 有登录态时 body.login_info + cookie 透传
 *   - 响应 header logininfo 自动入库
 *   - ret=100000 自动清态重试一次
 *
 * 使用示例（见 README）：
 * ```ts
 * import { initCocosNetwork } from '@tencent/pmd-api-cocos/network';
 *
 * initCocosNetwork({
 *   network: {
 *     svrdomain: {
 *       test: 'atest.igame.qq.com',
 *       prod: 'igame.qq.com',
 *     },
 *   },
 *   loginPath: '/v2/login/code',
 *   appid: 'wx14f5bb5ae9a067f8',
 *   // storage / getLoginCode 可不传，默认走 sys.localStorage + wx.login
 *   onLoginInfo: (info) => {
 *     // 可选：同步到 AuthService / 刷新 UI 等
 *   },
 * });
 *
 * // 控制台可执行（微信小游戏 / 开发者工具）：
 *   wx.__pmdSetEnv__('prod')  // → 切到正式环境并自动重启
 *   wx.__pmdSetEnv__('test')  // → 切回测试环境
 *   wx.__pmdGetEnv__()        // → 查看当前环境
 * // （非微信环境会回退挂到 globalThis 上）
 * ```
 */
function initCocosNetwork(options) {
  var _a, _b, _c;
  var storage = (_a = options.storage) !== null && _a !== void 0 ? _a : defaultStorage;
  var getLoginCode = (_b = options.getLoginCode) !== null && _b !== void 0 ? _b : defaultGetLoginCode;
  // 1) 先建好环境切换器，由它统一管理 baseUrl / loginUrl
  //    env storage 不复用登录态 storage（避免业务自定义 storage 的 JSON 处理影响），
  //    走 env 模块自己的默认实现：wx.getStorageSync → localStorage → 内存。
  var envSwitcher = createEnvSwitcher({
    svrdomain: options.network.svrdomain,
    storageKey: options.envStorageKey,
    autoRestart: options.envAutoRestart,
    globalSetEnvName: options.globalSetEnvName,
    globalGetEnvName: options.globalGetEnvName
  });
  var baseUrl = envSwitcher.getBaseUrl();
  var loginUrl = (_c = options.loginUrl) !== null && _c !== void 0 ? _c : "".concat(baseUrl).concat(options.loginPath);
  console.log("[pmd-api-cocos] env=".concat(envSwitcher.getEnv(), ", baseUrl=").concat(baseUrl));
  var loginMpMethod = function loginMpMethod() {
    return loginMp({
      url: loginUrl,
      appid: options.appid,
      onLoginInfo: options.onLoginInfo,
      storage: storage,
      storageKey: options.storageKey
    });
  };
  var engine = new NetworkEngine({
    requestInterceptors: [new CocosHostInterceptor({
      baseUrl: baseUrl
    }), new CocosLoginInfoParamInterceptor({
      appid: options.appid,
      platform: options.platform,
      ltype: options.ltype,
      storage: storage,
      storageKey: options.storageKey,
      getLoginCode: getLoginCode,
      loginMp: loginMpMethod,
      isTestEnv: function isTestEnv() {
        return envSwitcher.isTestEnv();
      }
    })],
    responseInterceptors: [new NormalizeResponseRetInterceptor({
      loginMp: loginMpMethod
    }),
    // GetDataInterceptor 必须最后一个（会改写 param）
    new GetDataInterceptor()]
  });
  // 监听 ebus 'event-on-cocos-login' 事件后自动重发上一次因登录态失效而挂起的请求
  engine.options.decorator = cocosLoginDecorator;
  // 把 engine.request 注入给 pmd-api-cocos 的 NetworkManager，
  // 后续业务调 `QueryUserInfoClient.QueryUserInfo(...)` 时就会走这条链
  NetworkManager.instance.setRequestImpl(engine.request);
  // 把 envSwitcher 挂到 engine 上，方便业务侧（如有需要）拿到
  engine.envSwitcher = envSwitcher;
  return engine;
}

export { initCocosNetwork };
