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

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

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

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

    return new Promise((resolve, reject) => {
      const { files = [], single = true, params } = options;

      if (!files) {
        console.error("【uploadFile】 缺少 files 参数");
        return;
      }
      if (!Array.isArray(files)) {
        console.error("【uploadFile】 的 files 需要是一个数组");
        return;
      }
      if (!params) {
        console.error("【uploadFile】 缺少 options.params 参数");
        return;
      }
      if (!params.type) {
        console.error("【uploadFile】 缺少 options.params.type 参数");
        return;
      }

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

      // 根据type获取对应的path
      const path = UPLOAD_FILE_PATH_ENUM[params.type];
      if (!path) {
        console.error(`【uploadFile】未找到 type ${params.type} 对应的 path `);
        return;
      }

      // 当single为false时，foreignKey是必需的
      if (!single) {
        if (!params.hasOwnProperty("foreignKey")) {
          console.error("【uploadFile】 的 single 是 false，缺少 options.params.foreignKey 参数");
          return;
        }
        // 如果 foreignKey 是 undefined，设置默认值为空字符串
        if (params.foreignKey === undefined || params.foreignKey === null)
          params.foreignKey = "";
      }

      // 如果没有文件则直接返回
      if (files.length === 0) {
        requestCount--;
        if (requestCount <= 0) {
          setLoading(false);
        }
        resolve(
          single
            ? { filePath: "" }
            : { id: params.foreignKey },
        );
        return;
      }

      const formData = new FormData();

      // 将文件添加到formData中
      files.forEach((f) => {
        f.originFileObj && formData.append("files", f.originFileObj);
      });

      // 将额外携带的参数添加到formData中
      Object.keys(params).forEach((key) => {
        formData.append(key, params[key]);
      });

      // 添加path参数
      formData.append("path", path);

      // 获取待上传的文件
      const filesLength = formData.getAll("files").length;

      // 如果没有文件则返回老文件
      if (filesLength === 0) {
        requestCount--;
        if (requestCount <= 0) {
          setLoading(false);
        }
        resolve(
          single
            ? { filePath: files[0].filePath }
            : { id: params.foreignKey },
        );
        return;
      }

      // 发送请求
      request(
        single ? `/${getBaseGateway()}/imgFiles/save` : `/${getBaseGateway()}/imgFiles/batchSave`,
        "post",
        formData,
        { "Content-Type": "multipart/form-data" },
      )
        .then((res) => {
          resolve(
            single
              ? { filePath: res.data.filePath }
              : { id: res.data.foreignKey },
          );
        })
        .catch((err) => {
          reject(err);
        })
        .finally(() => {
          // 减少请求数量并在没有进行中的请求时设置loading为false
          requestCount--;
          if (requestCount <= 0) {
            setLoading(false);
          }
        });
    });
  };

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

export default useUploadFile;
