const { getHostApi } = require("@/server/utils/store");
import { Loading } from "element-ui";

import { downloadImage, downloadOtherImage } from "@/server/utils";
import axios from "../utils/axios";
let loading;

function startLoading() {
  loading = Loading.service({
    lock: true,
    text: "拼命加载中...",
    spinner: "el-icon-loading",
    background: "rgba(0,0,0,.7)",
  });
}

function endLoading() {
  loading.close();
}

axios.defaults.timeout = 12600000;

// ===================== 订单查询相关 =====================
const QUERY_ORDER_API_MAP = {
  CN: {
    path: "factory/podJomallOrderProductCn/getProductCnByFactorySubOrderNumber",
    paramKey: "factorySubOrderNumber", // 参数名：工厂子订单号
  },
  US: {
    path: "factory/podJomallOrderProductUs/getProductUsByFactorySubOrderNumber",
    paramKey: "factorySubOrderNumber", // 参数名：工厂子订单号
  },
  GC: {
    path: "factory/podJomallOrderProduct/getSubOrderByThirdSubOrderNumber",
    paramKey: "thirdSubOrderNumber", // 参数名：第三方子订单号（老pod）
  },
};
/**
 * 通用查询订单接口
 * @param {string} type - 订单类型（CN/US/GC，GC代表老pod）
 * @param {string} orderNumber - 订单号（根据type自动匹配参数名：factorySubOrderNumber/thirdSubOrderNumber）
 * @returns {Promise} axios请求Promise对象
 * @throws {Error} 类型不支持/参数缺失时抛出异常
 */
export function findByPodProductionNoApi(orderNumber) {
  // 1. 前置参数校验
  if (!orderNumber.orderType) {
    throw new Error("查询订单失败：订单类型type为必传项（支持CN/US/GC）");
  }

  // 2. 校验订单类型是否支持
  const apiConfig = QUERY_ORDER_API_MAP[orderNumber.orderType];
  if (!apiConfig) {
    throw new Error(
      `查询订单失败：不支持的订单类型${orderNumber.orderType}，仅支持CN/US/GC`,
    );
  }

  // 3. 构造请求参数（根据类型自动匹配参数名）
  const requestParams = {
    [apiConfig.paramKey]: orderNumber.thirdSubOrderNumber,
    resizable: orderNumber.resizable,
  };

  // 4. 获取基地址并发送GET请求
  const env = getHostApi().apiApiHost;
  return axios.get(apiConfig.path, {
    baseURL: env,
    params: requestParams,
  });
}
// ===================== 素材下载相关 =====================
const downloadDesignImagesBaseApi = (urlPath, params) => {
  const env = getHostApi().apiApiHost;
  // 空值校验：避免params.ids不存在导致的报错
  const requestData = Array.isArray(params?.ids) ? [...params.ids] : [];

  return axios.post(urlPath, requestData, { baseURL: env, skipLoading: true });
};
// 接口路径映射表（集中管理，便于维护）
const API_PATH_MAP = {
  CN: "factory/podJomallOrderProductCn/downloadDesignImages",
  US: "factory/podJomallOrderProductUs/downloadDesignImages",
  GC: "factory/podJomallOrder/downloadByProduction",
  USHLC: "factory/podJomallOrderProductUs/downloadCompatibleDesignImages",
  CNHLC: "factory/podJomallOrderProductCn/downloadCompatibleDesignImages",
};

/**
 * 根据子订单号下载素材
 * @param {string} type - 订单类型（CN/US/GC/USHLC/CNHLC）
 * @param {object} params - 请求参数（包含ids数组）
 * @param {number} device - 设备类型（2/3）
 * @returns {Promise} 下载结果
 */
export async function downloadBySubOrderNumberApi(params) {
  try {
    startLoading();
    // 2. 处理设备类型为3时的订单类型映射（惠立彩）
    let targetType = params.orderType;
    if (params.device === 3) {
      targetType = params.orderType === "CN" ? "CNHLC" : "USHLC";
    }
    // 4. 发送请求获取下载链接
    const { data, message } = await downloadDesignImagesBaseApi(
      API_PATH_MAP[targetType],
      params,
    );
    // 建议明确获取响应data（根据实际axios响应结构调整）

    // 5. 处理响应数据
    // 转义中文
    let changeMessage;
    if (message) {
      changeMessage = encodeURIComponent(message);
    }

    let files = data || [changeMessage];

    // 6. 构建下载文件列表
    const fileEnv = getHostApi().fileApiUrl;

    files = files.map((el) => ({ url: `${fileEnv}${el}` }));
    console.log(106, files);
    const downloadFunc =
      params.device === 2 ? downloadOtherImage : downloadImage;
    const downloadResult = await downloadFunc(files);

    return {
      code: 200,
      message: "下载成功",
      data: downloadResult,
    };
  } catch (error) {
    // 统一错误处理：便于调试和用户提示
    console.error("下载素材失败：", error);
    // 可根据业务需求返回错误信息或重新抛出
    throw new Error(`下载失败：${error.message}`);
  } finally {
    endLoading();
  }
}

/**
 * 渲染进程调用主进程下载方法（Electron 6.x 兼容）
 * @param {number} device - 设备类型 2/3
 * @param {array} files - 下载文件列表
 * @returns {Promise} 下载结果
 */
// function callMainProcessDownload(device, files) {
//   // 生成唯一 requestId，用于匹配请求和响应（避免多请求冲突）
//   const requestId = `download_${Date.now()}_${Math.random()
//     .toString(36)
//     .substr(2, 9)}`;

//   return new Promise((resolve, reject) => {
//     // 1. 监听主进程的响应（一次性监听，避免内存泄漏）
//     const responseHandler = (event, result) => {
//       // 只处理当前 requestId 的响应
//       if (result.requestId !== requestId) return;

//       // 移除监听（关键：避免重复监听）
//       ipcRenderer.removeListener("download-image-response", responseHandler);

//       // 处理结果
//       if (result.success) {
//         resolve(result);
//       } else {
//         reject(new Error(result.message));
//       }
//     };
//     ipcRenderer.on("download-image-response", responseHandler);

//     // 2. 向主进程发送下载请求
//     ipcRenderer.send("download-image-request", {
//       requestId,
//       device,
//       files,
//     });

//     // 3. 超时处理（避免一直等待）
//     setTimeout(() => {
//       ipcRenderer.removeListener("download-image-response", responseHandler);
//       reject(new Error("调用主进程下载方法超时"));
//     }, 120000); // 2分钟超时
//   });
// }

// ===================== 订单完成相关 =====================
/**
 * 通用完成订单接口
 * @param {string} type - 订单类型（CN/US/GC，GC代表老pod）
 * @param {object} params - 完成订单的请求参数
 * @returns {Promise} axios请求Promise对象
 * @throws {Error} 类型不支持/参数错误时抛出异常
 */
export function completeDeliveryApi(params) {
  const COMPLETE_DELIVERY_API_MAP = {
    CN: {
      data: {
        id: params.id,
        podJomallOrderCnId: params.podJomallOrderCnId || "",
      },
      url: "factory/podJomallOrderProductCn/completeDelivery",
    },
    US: {
      data: {
        id: params.id,
        podJomallOrderUsId: params.podJomallOrderUsId || "",
      },
      url: "factory/podJomallOrderProductUs/completeDelivery",
    },
    GC: {
      data: { id: params.id },
      url: "factory/podJomallOrderProduct/completeDelivery",
    },
  };

  // 2. 校验订单类型是否支持
  const apiPath = COMPLETE_DELIVERY_API_MAP[params.orderType];

  // 3. 获取基地址并发送请求
  const env = getHostApi().apiApiHost;
  return axios.post(apiPath.url, apiPath.data, { baseURL: env });
}

export function checkUpdate(version) {
  return axios.get(
    `https://admin.jomalls.com/api/manage/rest/app/checkUpdate`,
    {
      params: {
        businessType: "production_assistant",
        version,
      },
    },
  );
}

export function getAllCountryApi(thirdSubOrderNumber) {
  return axios.get(`logisticsAddress/getAllCountry`, {
    params: {
      thirdSubOrderNumber,
    },
  });
}
