"use strict";
const common_vendor = require("../common/vendor.js");
const config_env = require("../config/env.js");
const loadingManager = {
  loadingCount: 0,
  loadingTimer: null,
  // 显示 loading
  show(options = {}) {
    const config = {
      title: "加载中...",
      mask: true,
      delay: 300,
      ...options
    };
    if (this.loadingCount > 0) {
      this.loadingCount++;
      return;
    }
    this.loadingTimer = setTimeout(() => {
      if (this.loadingCount > 0) {
        common_vendor.index.showLoading({
          title: config.title,
          mask: config.mask
        });
      }
    }, config.delay);
    this.loadingCount++;
  },
  // 隐藏 loading
  hide() {
    this.loadingCount = Math.max(0, this.loadingCount - 1);
    if (this.loadingCount === 0) {
      if (this.loadingTimer) {
        clearTimeout(this.loadingTimer);
        this.loadingTimer = null;
      }
      common_vendor.index.hideLoading();
    }
  },
  // 强制隐藏所有 loading
  forceHide() {
    this.loadingCount = 0;
    if (this.loadingTimer) {
      clearTimeout(this.loadingTimer);
      this.loadingTimer = null;
    }
    common_vendor.index.hideLoading();
  }
};
const request = {
  async get(url, params = {}, options = {}) {
    return this.request(url, "GET", params, options);
  },
  async post(url, data = {}, options = {}) {
    return this.request(url, "POST", data, options);
  },
  async put(url, data = {}, options = {}) {
    return this.request(url, "PUT", data, options);
  },
  async delete(url, data = {}, options = {}) {
    return this.request(url, "DELETE", data, options);
  },
  async request(url, method, data, options = {}) {
    let loadingConfig;
    if (options.loading === false) {
      loadingConfig = false;
    } else {
      loadingConfig = {
        show: true,
        title: "加载中...",
        mask: true,
        delay: 300,
        timeout: 1e4,
        ...typeof options.loading === "object" ? options.loading : {}
      };
    }
    const requestConfig = {
      timeout: 15e3,
      // 默认网络超时 15 秒
      ...options.request
    };
    const shouldShowLoading = loadingConfig !== false && loadingConfig.show !== false;
    if (shouldShowLoading) {
      loadingManager.show(loadingConfig);
    }
    const deviceInfo = common_vendor.index.getStorageSync("deviceInfo") || {};
    const sbbs = deviceInfo.deviceId || "";
    const sbmc = deviceInfo.model || "";
    const separator = url.includes("?") ? "&" : "?";
    const finalUrl = `${url}${separator}sbbs=${sbbs}&sbmc=${sbmc}`;
    let timeoutTimer = null;
    if (shouldShowLoading && loadingConfig.timeout) {
      timeoutTimer = setTimeout(() => {
        loadingManager.hide();
        common_vendor.index.showToast({
          title: "请求超时",
          icon: "none"
        });
      }, loadingConfig.timeout);
    }
    let requestData = data;
    if (options.formData && data && typeof data === "object") {
      requestData = Object.keys(data).map((key) => {
        const value = data[key];
        if (Array.isArray(value)) {
          return value.map((item) => `${encodeURIComponent(key)}=${encodeURIComponent(item)}`).join("&");
        } else {
          return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
        }
      }).join("&");
    }
    return new Promise((resolve, reject) => {
      common_vendor.index.request({
        url: `${config_env.env.baseUrl}${finalUrl}`,
        method,
        data: requestData,
        timeout: requestConfig.timeout,
        // 设置网络超时
        header: (() => {
          const headers = {};
          if (options.formData) {
            headers["content-type"] = "application/x-www-form-urlencoded";
          } else {
            headers["content-type"] = "application/json";
          }
          const jsessionId = common_vendor.index.getStorageSync("JSESSIONID");
          if (jsessionId) {
            headers["Cookie"] = `JSESSIONID=${jsessionId}`;
          }
          return headers;
        })(),
        success: (res) => {
          if (timeoutTimer) {
            clearTimeout(timeoutTimer);
          }
          const headers = res.header;
          const setCookie = headers["set-cookie"] || headers["Set-Cookie"];
          if (setCookie) {
            const match = setCookie.match(/JSESSIONID=([^;]+)/);
            if (match && match[1]) {
              common_vendor.index.setStorageSync("JSESSIONID", match[1]);
            }
          }
          if (res.statusCode === 200) {
            const responseData = {
              data: res.data
            };
            resolve(responseData);
          } else {
            reject(res);
          }
        },
        fail: (err) => {
          if (timeoutTimer) {
            clearTimeout(timeoutTimer);
          }
          common_vendor.index.showToast({
            title: "网络请求失败",
            icon: "none"
          });
          reject(err);
        },
        complete: () => {
          if (shouldShowLoading) {
            loadingManager.hide();
          }
        }
      });
    });
  }
};
request.loadingManager = loadingManager;
request.silent = {
  get: (url, params = {}) => request.get(url, params, { loading: false }),
  post: (url, data = {}) => request.post(url, data, { loading: false }),
  put: (url, data = {}) => request.put(url, data, { loading: false }),
  delete: (url, data = {}) => request.delete(url, data, { loading: false })
};
request.withLoading = (title) => ({
  get: (url, params = {}) => request.get(url, params, { loading: { title } }),
  post: (url, data = {}) => request.post(url, data, { loading: { title } }),
  put: (url, data = {}) => request.put(url, data, { loading: { title } }),
  delete: (url, data = {}) => request.delete(url, data, { loading: { title } })
});
exports.request = request;
//# sourceMappingURL=../../.sourcemap/mp-weixin/utils/request.js.map
