/**
 * 本文件用于处理文物的相关文件上传过程中的函数
 * 注意不要使用this可能导致找不到等问题，内部调用内部方法时直接使用fileUploadFuctions
 */
import { deleteFiles } from "@/api/file";
const fileUploadFuctions = {
  /**
   * 判断文件是否上传过
   * @param {File | Object} file 文件对象，可能是File可能就是普通对象
   * @returns {Boolean}  文件是否上传过
   */
  isFileRaw(file) {
    let isFileRaw = false;
    isFileRaw = file.status && file.status == "ready";
    return isFileRaw;
  },

  /**
   * 判断formData中是否有数据
   * @param {FormData} formData 文件对象，可能是File可能就是普通对象
   * @returns {Boolean}  formData中是否有数据
   */
  isFormDataHasData(formData) {
    const formDataArr = Array.from(formData.entries(), ([key, prop]) => ({
      [key]: {
        ContentLength: typeof prop === "string" ? prop.length : prop.size,
      },
    }));
    return formDataArr.length > 0;
  },

  /**
   * 获取对应媒体下的文件
   * @param {string} mediaKey 媒体key
   * @returns {Array} 媒体对应的文件
   */
  getMediaFile($el, mediaKey) {
    return $el.$refs[mediaKey].getFiles();
  },

  /**
   * 获取需要上传的FormData
   * @param {Array} mediaKeys 媒体keys数组
   * @returns {FormData} formData 需要上传的formdata
   */
  getNeedUploadFormData($el, mediaKeys) {
    const formData = new FormData();
    mediaKeys.forEach((mediaKey) => {
      const currentFileList = fileUploadFuctions.getMediaFile($el, mediaKey);
      currentFileList.forEach((file) => {
        if (fileUploadFuctions.isFileRaw(file)) {
          formData.append(mediaKey, file.raw);
        }
      });
    });
    return formData;
  },

  /**
   * 获取需要已经存在（数据库已存储的）文件ID对象，并且仍然需要保留的
   * @param {Array} mediaKeys 媒体keys数组
   * @param {Array} dialogForm 表单对象
   * @param {Array} removedIds 已经被删除的ID
   * @returns {Object} 已经存在（数据库已存储的）文件ID对象
   */
  getOldIdsObj({ mediaKeys, dialogForm, removedIds }, $el) {
    // debugger
    let oldFileIdsObj = {};
    // 文物的3D文件和封面需要单独处理

    mediaKeys.forEach((key) => {
      // 因为封面和3D文件的旧ID就是dialogForm的faceImage和file3d，此时还是旧的
      // 新的在调用组件的this.faceImage和this.file3d对象里
      if (key == "faceImage" && !removedIds.includes(dialogForm.faceImage)) {
        oldFileIdsObj.faceImage = dialogForm.faceImage;
        return;
      }
      if (key == "file3d" && !removedIds.includes(dialogForm.file3d)) {
        oldFileIdsObj.file3d = dialogForm.file3d;
        return;
      }
      // const voKey = `${key}Vo`;
      if ($el.$refs[key]) {
        // 已存在的文件status为success
        const files = $el.$refs[key].getFiles();
        const successItems = files.filter((item) => {
          return item.status == "success" && !removedIds.includes(item.fileId);
        });
        if (successItems.length > 0) {
          // 获取他们的fileId
          oldFileIdsObj[key] = successItems
            .map((item) => {
              return item.fileId;
            })
            .join(",");
        } else {
          oldFileIdsObj[key] = "";
        }
      } else {
        oldFileIdsObj[key] = "";
      }
    });
    return oldFileIdsObj;
  },

  /**
   * 获取返回结果中的文件id对象
   * @param {Array} mediaKeys 媒体keys数组
   * @param {Object} requestRes 上传返回的数据对象
   * @returns {Object}  新上传的文件id对象
   */
  getNewIdsObj(mediaKeys, requestRes) {
    let newUploadedFileIdsObj = {};
    mediaKeys.forEach((key) => {
      newUploadedFileIdsObj[key] = fileUploadFuctions.getResIdStrByMedia(
        key,
        requestRes
      );
    });
    return newUploadedFileIdsObj;
  },

  /**
   * 获取上传返回结果中的id字符串
   * @param {Array} mediaKeys 媒体keys数组
   * @param {Object} requestRes 上传返回的数据对象
   * @returns {string}  新上传的文件id字符串
   */
  getResIdStrByMedia(mediaKey, requestRes) {
    const arr = [];
    requestRes.data.forEach((item) => {
      if (item.fileKey == mediaKey) {
        arr.push(item.fileId);
      }
    });
    const str = arr.length > 0 ? arr.join(",") : "";
    return str;
  },

  /**
   * 获取新旧合并的文件id对象
   * @param {Array} mediaKeys 媒体keys数组
   * @param {Object} oldObj 已经存在的
   * @param {Object} newObj 新上传的
   * @returns {string}  新上传的文件id字符串
   */
  getMergedIdsObj(oldObj, newObj, mediaKeys) {
    // debugger;
    const obj = {};
    mediaKeys.forEach((key) => {
      if (key == "file3d" || key == "faceImage") {
        obj[key] = newObj[key];
        return;
      }
      let newArr = [];
      let oldArr = [];
      if (newObj[key]) {
        newArr = newObj[key].split(",");
      }
      if (oldObj[key]) {
        oldArr = oldObj[key].split(",");
      }
      let fullArr = [...new Set([...newArr, ...oldArr])];
      let fullStr = "";
      if (fullArr.length > 0) {
        fullStr = fullArr.join(",");
      }
      obj[key] = fullStr;
    });
    return obj;
  },

  /**
   * 获取需要被删除的文件ID合集
   * @param {Array} mediaKeys 媒体keys数组
   * @param {Object} dialogForm 表单对象
   * @param {Object} newUploadedFileIdsObj 最新上传之后的
   * @returns {Object}  新上传的文件id对象
   */
  getDeleteFileArr(oldObj, newObj, mediaKeys) {
    const arr = [];
    mediaKeys.forEach((key) => {
      let newArr = newObj[key].split(",");
      let oldArr = oldObj[key].split(",");
      let fullArr = [...new Set([...newArr, ...oldArr])];
      oldArr.forEach((oldId) => {
        if (!fullArr.includes(oldId)) {
          arr.push(oldId);
        }
      });
    });
    return arr;
  },

  /**
   * @param {array} fileArr 需要被删除的文件ID数组
   */
  async handleDeleteFiles(fileArr) {
    console.log("doing delete");
    if (fileArr.length == 0) {
      console.log("nothing to delete");
      return;
    }
    await deleteFiles(fileArr);
    console.log("delete done");
  },
};
export default fileUploadFuctions;
