import { request } from "@cqsjjb/jjb-common-lib/http.js";
import { useState } from "react";
import { UPLOAD_FILE_TYPE_ENUM } from "../../enum/uploadFile/gwj";
import { addingPrefixToFile, getBaseGateway } from "../../utils";

/**
 * 获取文件
 */
function useGetFile(returnType = "object") {
  // loading状态
  const [loading, setLoading] = useState(false);
  // 用于跟踪进行中的请求数量（不暴露给外部）
  let requestCount = 0;

  // 获取文件
  const getFile = (options) => {
    if (!options) {
      console.error("【getFile】 缺少 options 参数");
      return;
    }

    // 增加请求数量并设置loading状态
    requestCount++;
    if (requestCount > 0) {
      setLoading(true);
    }

    return new Promise((resolve, reject) => {
      const { eqType, eqForeignKey, single = true, foreignKey, dataSource } = options;

      if (!eqType) {
        console.error("【getFile】 缺少 options.eqType 参数");
        return;
      }

      // 检查eqType是否在UPLOAD_FILE_TYPE_ENUM中
      if (!Object.values(UPLOAD_FILE_TYPE_ENUM).includes(eqType)) {
        console.error(`【getFile】 传入的 eqType 不在 UPLOAD_FILE_TYPE_ENUM 中，当前传入的 eqType 是 ${eqType}`);
        return;
      }

      if (single) {
        if (eqForeignKey === undefined || eqForeignKey === null || eqForeignKey === "") {
          console.error("【getFile】 缺少 options.eqForeignKey 参数");
          return;
        }
      }
      else {
        if (foreignKey === undefined || foreignKey === null || foreignKey === "") {
          console.error("【getFile】 缺少 options.foreignKey 参数");
          return;
        }

        if (dataSource === undefined || dataSource === null || dataSource === "") {
          console.error("【getFile】 缺少 options.dataSource 参数");
          return;
        }

        if (dataSource.length === 0) {
          setLoading(false);
          resolve(dataSource);
          return;
        }
      }

      const params = single ? { eqType, eqForeignKey } : { eqType, inForeignKey: dataSource.map(item => item[foreignKey]).join(",") };

      // 发送请求
      request(
        `/${getBaseGateway()}/imgFiles/listAll`,
        "get",
        params,
      )
        .then((res) => {
          if (single) {
            resolve(addingPrefixToFile(res.data).map(item => ({ ...item, type: undefined })));
          }
          else {
            // 创建一个 Map 来提高查找效率
            const fileMap = new Map();

            // 将 res.data 按照 foreigKey 分组
            res.data.forEach((file) => {
              if (!fileMap.has(file.foreignKey)) {
                fileMap.set(file.foreignKey, []);
              }
              fileMap.get(file.foreignKey).push({ ...file, type: undefined });
            });

            // 为 dataSource 中的每一项添加对应的文件列表
            const result = dataSource.map((item) => {
              const itemForeignKey = item[foreignKey];
              const matchedFiles = fileMap.has(itemForeignKey)
                ? addingPrefixToFile(fileMap.get(itemForeignKey))
                : [];

              return {
                ...item,
                files: matchedFiles,
              };
            });

            resolve(result);
          }
        })
        .catch((err) => {
          reject(err);
        })
        .finally(() => {
          // 减少请求数量并在没有进行中的请求时设置loading为false
          requestCount--;
          if (requestCount <= 0) {
            setLoading(false);
          }
        });
    });
  };

  if (returnType === "array")
    return [loading, getFile];
  return { loading, getFile };
}

export default useGetFile;
