const XLSX = require("xlsx");
import Papa from "papaparse";

export const ChenUtil = {
  // tree
  treeUtil: {
    generateTreeData: function (data, nodeId, parentNodeKey) {
      // 将数据存储为以 nodeId 为 KEY 的 map 索引数据列
      const map = {};
      data.forEach((item) => {
        item.children = [];
        map[item[nodeId]] = item;
      });

      // 遍历数据,构建树形结构
      const rootNodes = [];
      data.forEach((item) => {
        const parent = map[item[parentNodeKey]];
        if (parent) {
          parent.children.push(item);
          item.parent = parent;
        } else {
          rootNodes.push(item);
        }
      });

      return rootNodes;
    },
    // 在树形结构中查找指定id节点
    findNodeInTree: function (tree, id) {
      for (let i = 0; i < tree.length; i++) {
        if (tree[i].id === id) {
          return tree[i];
        } else {
          if (tree[i].children) {
            let node = this.findNodeInTree(tree[i].children, id);
            if (node) {
              return node;
            }
          }
        }
      }
    },
    // 在树形结构中查找指定id节点的上一个父节点
    findParentNodeInTree: function (tree, id) {
      // Id等于0的节点为根节点,没有父节点
      // id找到了的话,往上找一层父节点返回
      if (id === 0) {
        return null;
      }
      for (let i = 0; i < tree.length; i++) {
        if (tree[i].id === id) {
          return tree[i].parent;
        } else {
          if (tree[i].children) {
            let node = this.findParentNodeInTree(tree[i].children, id);
            if (node) {
              return node;
            }
          }
        }
      }
    },
  },
  // cookie
  cookie: {
    setCookie: function (name, value, day) {
      const date = new Date();
      date.setDate(date.getDate() + day);
      document.cookie = name + "=" + value + ";expires=" + date;
    },
    getCookie: function (cname) {
      var name = cname + "=";
      var ca = document.cookie.split(";");
      for (var i = 0; i < ca.length; i++) {
        var c = ca[i].trim();
        if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
      }
      return "";
    },
    delCookie: function (name) {
      this.setCookie(name, "", -1);
    },
  },
  // turnFile
  turnFile: {
    // base64转file
    base64toFile: function (base64, filename) {
      let arr = base64.split(",");
      let mime = arr[0].match(/:(.*?);/)[1];
      let suffix = mime.split("/")[1];
      let bstr = atob(arr[1]);
      let n = bstr.length;
      let u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new File([u8arr], `${filename}.${suffix}`, {
        type: mime,
      });
    },
    //获取图片url转换file对象
    getImageFileFromUrl: function (url, imageName) {
      return new Promise((resolve, reject) => {
        var blob = null;
        var xhr = new XMLHttpRequest();
        xhr.open("GET", url);
        xhr.setRequestHeader("Accept", "image/jpeg");
        xhr.responseType = "blob";
        xhr.onload = () => {
          blob = xhr.response;
          let imgFile = new File([blob], imageName, { type: "image/jpeg" });
          resolve(imgFile);
        };
        xhr.onerror = (e) => {
          reject(e);
        };
        xhr.send();
      });
    },
    // 文件url转换file对象
    getFileFromUrl: function (url, fileName) {
      return new Promise((resolve, reject) => {
        var blob = null;
        var xhr = new XMLHttpRequest();
        xhr.open("GET", url);
        xhr.responseType = "blob";
        xhr.onload = () => {
          blob = xhr.response;
          let file = new File([blob], fileName);
          // let file = new File([blob], fileName, {
          //     type: 'application/octet-stream',
          // });
          resolve(file);
        };
        xhr.onerror = (e) => {
          reject(e);
        };
        xhr.send();
      });
    },
  },
  // download
  download: {
    /**
     * 将url文件下载到本地
     * @param fileUrl {String} 文件链接
     * @param fileName {String} 文件名字
     * @return void
     */
    downloadFile: async function (fileUrl, fileName) {
      console.log(fileUrl);
      let blob = await this.getBlob(fileUrl);
      this.saveFile(blob, fileName);
    },
    getBlob: function (fileUrl) {
      return new Promise((resolve) => {
        const xhr = new XMLHttpRequest();
        xhr.open("GET", fileUrl, true);
        xhr.setRequestHeader(
          "content-type",
          "application/x-www-form-urlencoded"
        );

        //监听进度
        xhr.addEventListener(
          "progress",
          function (evt) {
            if (evt.lengthComputable) {
              let percentComplete = evt.loaded / evt.total;
              // 下载进度
              let percentage = percentComplete * 100;
              console.log(percentage);
            }
          },
          false
        );
        xhr.responseType = "blob";
        xhr.onload = () => {
          if (xhr.status === 200) {
            resolve(xhr.response);
          }
        };
        xhr.send();
      });
    },
    saveFile: function (blob, fileName) {
      // ie的下载
      if (window.navigator.msSaveOrOpenBlob) {
        navigator.msSaveBlob(blob, fileName);
      } else {
        // 非ie的下载
        const link = document.createElement("a");
        const body = document.querySelector("body");

        link.href = window.URL.createObjectURL(blob);
        link.download = fileName;

        // fix Firefox
        link.style.display = "none";
        body.appendChild(link);

        link.click();
        body.removeChild(link);

        window.URL.revokeObjectURL(link.href);
      }
    },
  },
  // 加密/解密
  secret: function (string, code, operation) {
    // string-需要解密的字段  code-约定的密钥    operation 默认false表示加密,传入true表示解密
    // 引入:import CryptoJS from 'crypto-js'; npm install crypto-js --save
    // cdn: <script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
    code = CryptoJS.MD5(code).toString();
    var iv = CryptoJS.enc.Utf8.parse(code.substring(0, 16));
    var key = CryptoJS.enc.Utf8.parse(code.substring(16));
    if (operation) {
      return CryptoJS.AES.decrypt(string, key, {
        iv: iv,
        padding: CryptoJS.pad.Pkcs7,
      }).toString(CryptoJS.enc.Utf8);
    }
    return CryptoJS.AES.encrypt(string, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
    }).toString();
  },
  // 文件读取
  file: {
    // 文件读取,将xlsx,xls转为json
    // npm install xlsx --save
    xlsxReadFile: function (file) {
      return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = () => {
          const data = reader.result;
          const workbook = XLSX.read(data, { type: "binary" });
          const sheetNames = workbook.SheetNames;
          const result = {};
          sheetNames.forEach((sheetName) => {
            const worksheet = workbook.Sheets[sheetName];
            const jsonData = XLSX.utils.sheet_to_json(worksheet);
            result[sheetName] = jsonData;
          });
          resolve(result);
        };
        reader.onerror = () => {
          reject(reader.error);
        };
        reader.readAsBinaryString(file);
      });
    },
    // 文件读取,将csv转json
    // npm install papaparse
    convertToJSON: function (file) {
      return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = () => {
          const csvString = reader.result;
          const parsedResult = Papa.parse(csvString, {
            header: true,
          });
          resolve(parsedResult.data);
        };
        reader.onerror = () => {
          reject(reader.error);
        };
        reader.readAsText(file);
      });
    },
  },
};