/**
 * 本文件用于处理文物的相关文件上传过程中的函数
 * 注意不要使用this可能导致找不到等问题，内部调用内部方法时直接使用fileUploadFuctions
 */
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数组
   * @returns {Object} 已经存在（数据库已存储的）文件ID对象
   */
  getOldIdsObj(mediaKeys, dialogForm) {
    let oldFileIdsObj = {};
    mediaKeys.forEach((key) => {
      if (dialogForm[key]) {
        oldFileIdsObj[key] = dialogForm[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) {
    const obj = {};
    mediaKeys.forEach((key) => {
      let newArr = newObj[key].split(",");
      let oldArr = oldObj[key].split(",");
      let fullArr = [...new Set([...newArr, ...oldArr])];
      let fullStr = fullArr.join(",");
      obj[key] = fullStr.substring(0, fullStr.length - 1);
    });
    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;
