import moment from "moment";
import {
  post,
  get
} from "@/utils/request";
import Cookies from "js-cookie";
import html2Canvas from "html2canvas";
import JsPDF from "jspdf";
import * as toEnglish from "./ACapital.js";
import {
  ElMessage,
  ElMessageBox
} from 'element-plus'
import useUserStore from '@/store/modules/user'


// businessIdList 业务id列表  dataSource 数据源  att  要对应的属性  fileAtt  要赋值的属性  filePathAtt  取第一张图片的属性
export function getFile(businessIdList, dataSource, att = 'id', fileAtt = 'fileList', filePathAtt = '') {
  if (businessIdList && businessIdList.length > 0 && dataSource && dataSource.length > 0) {
    post("/fileInfo/getList", {
      businessIdList,
    }).then((res) => {
      for (let i = 0; i < dataSource.length; i++) {
        const ele = dataSource[i];
        for (const key in res) {
          if (ele[att] == key && res[key] && res[key].length > 0) {
            ele[fileAtt] = res[key]
            if (filePathAtt) {
              ele[filePathAtt] = res[key][0].fileUrl
            }
          }
        }

      }
    });
  }
  return false
}


// businessIdList 业务id列表  data 数据源  att  要对应的属性   businessType取业务类型的数据  fileAtt  要赋值的属性  filePathAtt  取第一张图片的属性
export function getFileData(option = {}) {
  return new Promise((resolve) => {
    let {
      businessIdList,
      data,
      att = 'id',
      businessType = '',
      fileAtt = "fileList",
      filePathAtt = 'imageUrl',
      getAll = false
    } = option
    if (businessIdList && businessIdList.length > 0) {
      if (getAll) {
        resolve(post("/fileInfo/getList", {
          businessIdList,
        }))
        return
      } else {
        post("/fileInfo/getList", {
          businessIdList,
        }).then((res) => {
          if (data && data.length > 0) {
            for (let i = 0; i < data.length; i++) {
              const ele = data[i];
              for (const key in res) {
                if (ele[att] == key && res[key] && res[key].length > 0) {
                  let list = []
                  if (businessType) {
                    list = res[key].filter((x) => x.businessType == businessType)
                  } else {
                    list = res[key]
                  }
                  ele[fileAtt] = list
                  if (filePathAtt) {
                    ele[filePathAtt] = list[0].fileUrl
                  }
                }
              }
            }
          }
        });
      }
    }
  })

}

export function openImg(fileUrl) {
  if (fileUrl) {
    window.open(fileUrl, "_blank");
  }
}

export function isCurrentCompanyData(companyId) {
  const currentCompanyId = useUserStore().user.companyId
  if (companyId && (currentCompanyId == companyId)) {
    return true
  } else {
    return false
  }
}


//根据dictKey值回显字典label值
export function dictKeyValue(value, arr) {
  if ((value || value == 0) && arr) {
    value = value + "";
    const current = arr.find((x) => x.dictKey == value);
    if (current != undefined && current.dictValue) {
      return current.dictValue;
    }
    return "";
  }
  return "";
}

//根据value值回显字典label值
export function dictValueLabel(value, arr) {
  if ((value || value === 0) && arr) {
    const current = arr.filter((x) => x.value == value);
    if (current && current.length > 0) {
      return current[0].label;
    }
    return "";
  }
  return "";
}

export function getDict(key) {
  return new Promise((resolve, reject) => {
    let dictObj = {};
    let arr = {};
    let num = 0;
    for (let i = 0; i < key.length; i++) {
      const element = key[i];
      if (dictObj[element]) {
        arr[element] = dictObj[element];
        num++;
        if (num === key.length) {
          resolve(arr);
        }
      } else {
        post("/dictTenantData/page", {
          pageNum: 1,
          pageSize: 999,
          tenantId: Cookies.get("tenantId"),
          dictCode: element,
        }).then((res) => {
          dictObj[element] = res.rows;
          arr[element] = res.rows;
          sessionStorage.setItem("dict", JSON.stringify(dictObj));
          num++;
          if (num === key.length) {
            resolve(arr);
          }
        });
      }
    }
  });
}

export function getDictOne(key) {
  return new Promise((resolve, reject) => {
    let dictObj = {};
    let arr = {};
    let num = 0;
    for (let i = 0; i < key.length; i++) {
      const element = key[i];
      if (dictObj[element]) {
        arr[element] = dictObj[element];
        num++;
        if (num === key.length) {
          resolve(arr);
        }
      } else {
        post("/tenantDict/getDict", {
          dictCode: element,
        }).then((res) => {
          dictObj[element] = res;
          arr[element] = res;
          num++;
          if (num === key.length) {
            resolve(arr);
          }
        });
      }
    }
  });
}

// 金额千分符
export function moneyFormat(s, n) {
  if (s) {
    s = s + "";
    let str = s.slice(0, 1);
    if (str === "-") {
      s = s.slice(1, s.length);
    }
    n = n > 0 && n <= 20 ? n : 2;
    s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";
    var l = s.split(".")[0].split("").reverse(),
      r = s.split(".")[1];
    var t = "";
    for (let i = 0; i < l.length; i++) {
      t += l[i] + ((i + 1) % 3 == 0 && i + 1 != l.length ? "," : "");
    }
    let result = t.split("").reverse().join("") + "." + r;
    if (str === "-") {
      return "-" + result;
    } else {
      return result;
    }
  } else {
    return "0.00";
  }
}

// 计算该日期是星期几
export function calculationWeek(val, format) {
  let weekArrayList = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
  let index = new Date(moment(val, format).format("yyyy-MM-DD")).getDay();
  let week = weekArrayList[index];
  return week;
}

export function getPdf(title) {
  // pdfDom 这个就是你vue页面中定义的ID  比如<div id="pdfDom">  这个也要避下雷
  const element = document.getElementById("pdfDom");
  window.pageYoffset = 0;
  document.documentElement.scrollTop = 0;
  document.body.scrollTop = 0;
  setTimeout(() => {
    // const nowDate = new Date();
    // const date = {
    //   year: nowDate.getFullYear(),
    //   month: nowDate.getMonth() + 1,
    //   date: nowDate.getDate(),
    //   hours: nowDate.getHours(),
    //   minutes: nowDate.getMinutes(),
    //   seconds: nowDate.getSeconds(),
    // };
    // const newMonth = date.month > 10 ? date.month : "0" + date.month;
    // const newDay = date.date > 10 ? date.date : "0" + date.date;
    // const newMinutes = date.minutes < 10 ? "0" + date.minutes : date.minutes;
    // const newSeconds = date.seconds < 10 ? "0" + date.seconds : date.seconds;
    // const value = date.year + newMonth + newDay + date.hours + newMinutes + newSeconds;
    let id = "";
    //创建一个画布    ---  增加导出的pdf水印 !!
    let can = document.createElement("canvas");
    //设置画布的长宽
    can.width = 400;
    can.height = 500;
    let cans = can.getContext("2d");
    //旋转角度
    cans.rotate((-15 * Math.PI) / 180);
    cans.font = "18px Vedana";
    //设置填充绘画的颜色、渐变或者模式
    cans.fillStyle = "rgba(200, 200, 200, 0.40)";
    //设置文本内容的当前对齐方式
    cans.textAlign = "left";
    //设置在绘制文本时使用的当前文本基线
    cans.textBaseline = "Middle";
    //在画布上绘制填色的文本(输出的文本,开始绘制文本的X坐标位置,开始绘制文本的Y坐标位置)
    //cans.fillText(value, can.width / 8, can.height / 2)
    let div = document.createElement("div");
    div.id = id;
    div.style.pointerEvents = "none";
    div.style.top = "2000px";
    div.style.left = "-2000px";
    div.style.position = "fixed";
    div.style.zIndex = "100000";
    div.style.width = document.getElementById("pdfDom").scrollHeight + "px";
    div.style.height = document.getElementById("pdfDom").scrollHeight + "px";
    div.style.background = "url(" + can.toDataURL("image/png") + ") left top repeat";
    document.getElementById("pdfDom").appendChild(div); // 到页面中
    html2Canvas(element, {
      allowTaint: true,
      useCORS: true, // 需要注意,element的 高度 宽度一定要在这里定义一下,不然会存在只下载了当前你能看到的页面   避雷避雷!!!
      scale: 2, // 提升画面质量,但是会增加文件大小
      height: document.getElementById("pdfDom").scrollHeight,
      windowHeight: document.getElementById("pdfDom").scrollHeight,
    }).then(function (canvas) {
      var contentWidth = canvas.width;
      var contentHeight = canvas.height;
      // 一页pdf显示html页面生成的canvas高度;
      var pageHeight = (contentWidth * 841.89) / 592.28;
      // 未生成pdf的html页面高度
      var leftHeight = contentHeight;
      // 页面偏移
      var position = 0;
      // a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
      var imgWidth = 595.28;
      var imgHeight = (592.28 / contentWidth) * contentHeight;
      var pageData = canvas.toDataURL("image/jpeg", 1.0);
      var pdf = new JsPDF("", "pt", "a4");
      // 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
      // 当内容未超过pdf一页显示的范围,无需分页
      if (leftHeight < pageHeight) {
        pdf.addImage(pageData, "JPEG", 0, 0, imgWidth, imgHeight);
      } else {
        while (leftHeight > 0) {
          pdf.addImage(pageData, "JPEG", 0, position, imgWidth, imgHeight);
          leftHeight -= pageHeight;
          position -= 841.89;
          // 避免添加空白页
          if (leftHeight > 0) {
            pdf.addPage();
          }
        }
      }
      pdf.save(title + ".pdf");
    });
  }, 1000);
}
export function getPdfTransverseA4(title) {
  html2Canvas(document.getElementById("pdfDom"), {
    // allowTaint: true,
    // taintTest: false,
    // logging: false,
    // useCORS: true,
    // dpi: window.devicePixelRatio * 2, // 将分辨率提高到特定的DPI 提高四倍
    // scale: 2, // 按比例增加分辨率
    allowTaint: true,
    useCORS: true, // 需要注意,element的 高度 宽度一定要在这里定义一下,不然会存在只下载了当前你能看到的页面   避雷避雷!!!
    scale: 4, // 提升画面质量,但是会增加文件大小
    height: document.getElementById("pdfDom").scrollHeight,
    windowHeight: document.getElementById("pdfDom").scrollHeight,
  }).then((canvas) => {
    // eslint-disable-next-line new-cap
    var pdf = new JsPDF("l", "mm", "a4"); // A3纸,横向
    // var pdf = new JsPDF('p', 'mm', 'a4') // A4纸,纵向
    var ctx = canvas.getContext("2d");
    // A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
    // var a4w = 190;
    // var a4h = 277
    // A3大小,279mm x 420mm,四边各保留10mm的边距,显示区域259x400
    // var a4w = 259;
    // var a4h = 400;
    var a4w = 210;
    var a4h = 297;
    // var imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4显示比例换算一页图像的像素高度[这个计算方式应该是纵向]
    var imgHeight = Math.floor((a4w * canvas.width) / a4h); // 按A4显示比例换算一页图像的像素高度[这个是横向打印的计算方法]
    var renderedHeight = 0;
    while (renderedHeight < canvas.height) {
      var page = document.createElement("canvas");
      page.width = canvas.width;
      page.height = Math.min(imgHeight, canvas.height - renderedHeight); // 可能内容不足一页
      // 用getImageData剪裁指定区域,并画到前面创建的canvas对象中
      page.getContext("2d").putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);
      // 添加图像到页面,保留10mm边距 [a4使用]
      // pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width))
      // 添加图像到页面,保留10mm边距[a3使用1.414换算比例]
      // pdf.addImage(page.toDataURL("image/jpeg", 1.0), "JPEG", 10, 10, a4w * 1.414, Math.min(a4h, (a4w * page.height) / page.width) * 1.414);
      pdf.addImage(page.toDataURL("image/jpeg", 1.0), "JPEG", 0, 0, a4w * 1.414, Math.min(a4h, (a4w * page.height) / page.width) * 1.414);
      renderedHeight += imgHeight;
      if (renderedHeight < canvas.height) {
        pdf.addPage(); // 如果后面还有内容,添加一个空页
      }
    }
    // 保存文件
    pdf.save(title + ".pdf");
  });
}

export function currencyPrefix(key) {
  return "SAY " + key + " ";
}

// 金额英文写法
export function translateIntoEnglish(money, currencyType) {
  let text = "";
  if (money) {
    text = currencyPrefix(currencyType);
    if (!/^\d+$/.test(Number(money))) {
      text = text + parseFloat(money).toFixed(2).toEnglish().toUpperCase();
    } else {
      text = text + parseFloat(money).toFixed(2).toEnglish().toUpperCase() + " ONLY";
    }
  }
  text = text.split(" POINT ZERO ZERO ").join("");
  return text;
}

// 随机数
export function random() {
  let $chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
  let maxPos = $chars.length;
  let random = "";
  for (let i = 0; i < 32; i++) {
    random += $chars.charAt(Math.floor(Math.random() * maxPos));
  }
  return random;
}

// 深拷贝
export function checkType(target) {
  return Object.prototype.toString.call(target).slice(8, -1);
}
export function deepClone(data) {
  const obj = checkType(data) === "Array" ? [] : {};
  let arr = ["Object", "Array"];
  if (arr.includes(checkType(data))) {
    for (let key in data) {
      let value = data[key];
      //value为简单类型,直接赋值
      if (!arr.includes(checkType(value))) {
        obj[key] = value;
      } else {
        // 定义一个映射,初始化时,将data本身加入映射中
        const map = new WeakMap();
        // 如果拷贝的是复杂数据类型第一次拷贝后存入map
        // 第二次再遇到该值时,直接赋值为null,结束递归
        map.set(data, true);
        if (map.has(value)) {
          obj[key] = null;
        } else {
          map.set(value, true);
          obj[key] = deepClone(value);
        }
      }
    }
  } else {
    return data;
  }
  return obj;
}

// 计算时间间隔
export function timeInterval(smallTime, largeTime) {
  //一般前端使用的时间分隔符是"-",需要替换成"/"
  let large = new Date(largeTime.replace("-", "/").replace("-", "/"));
  let small = new Date(smallTime.replace("-", "/").replace("-", "/"));
  if (large > small) {
    let date3 = large.getTime() - new Date(small).getTime(); //时间差的毫秒数
    //计算出相差天数
    let days = Math.floor(date3 / (24 * 3600 * 1000));
    //计算出小时数
    let leave1 = date3 % (24 * 3600 * 1000); //计算天数后剩余的毫秒数
    let hours = Math.floor(leave1 / (3600 * 1000));
    //计算相差分钟数
    let leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
    let minutes = Math.floor(leave2 / (60 * 1000));
    //计算相差秒数
    let leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
    let seconds = Math.round(leave3 / 1000);
    return {
      days: days,
      hours: hours,
      minutes: minutes,
      seconds: seconds,
    };
  }
  return {
    days: 0,
    hours: 0,
    minutes: 0,
    seconds: 0,
  };
}

// 比较时间大小
export function compareTime(date1, date2) {
  var oDate1 = new Date(date1);
  var oDate2 = new Date(date2);
  if (oDate1.getTime() > oDate2.getTime()) {
    return true; //第一个大
  } else {
    return false; //第二个大
  }
}
export function toDx(n) {
  //阿拉伯数字转换函数
  switch (n) {
    case "0":
      return "零";
    case "1":
      return "壹";
    case "2":
      return "贰";
    case "3":
      return "叁";
    case "4":
      return "肆";
    case "5":
      return "伍";
    case "6":
      return "陆";
    case "7":
      return "柒";
    case "8":
      return "捌";
    case "9":
      return "玖";
  }
}

// 金额转大写
export function NumberToChinese(m) {
  let unit = ["仟", "佰", "拾", "", "仟", "佰", "拾", "", "角", "分", "厘"];
  m *= 1000;
  m = Number(parseFloat(m).toFixed(0));
  m += "";
  var x = m.length;
  var result = "";
  for (var i = 0; i < x; i++) {
    if (i == 3) {
      result = "元" + result;
    } else if (i == 7) {
      result = "万" + result;
    }
    if (m.charAt(x - i - 1) == 0) {
      if (i != 0 && i != 1 && i != 2) {
        if (result.charAt(0) != "零" && result.charAt(0) != "元" && result.charAt(0) != "万") {
          result = "零" + result;
        }
      }
      continue;
    }
    result = toDx(m.charAt(x - i - 1)) + unit[unit.length - i - 1] + result;
  }
  result += result.charAt(result.length - 1) == "元" ? "整" : "";
  return result;
}

// 图片url转base64
export function getImgBase64(url) {
  return new Promise((resolve, reject) => {
    let Img = new Image(),
      dataURL = "";
    Img.setAttribute("crossOrigin", "Anonymous");
    Img.src = url + "?v=" + Math.random();
    Img.onload = function () {
      let canvas = document.createElement("canvas"),
        width = Img.width,
        height = Img.height;
      canvas.width = width;
      canvas.height = height;
      canvas.getContext("2d").drawImage(Img, 0, 0, width, height);
      dataURL = canvas.toDataURL("image/png");
      resolve(dataURL);
    };
    Img.onerror = function () {
      reject("图片加载失败");
    };
  });
};

export function downloadFile(fileStream, fileName) {
  // 创建 Blob 对象
  const blob = new Blob([fileStream]);
  // 创建下载链接
  const url = URL.createObjectURL(blob);
  // 创建 <a> 元素
  const a = document.createElement("a");
  a.href = url;
  a.download = fileName;
  // 模拟点击下载
  a.click();
  // 释放对象
  URL.revokeObjectURL(url);
}

// 消息提示
export function msgTip(message, type = 1) {
  let obj = {
    1: 'success',
    2: "info",
    3: "warning",
    4: "error"
  }
  ElMessage({
    type: obj[type],
    message,
  })
  return
}

// 消息确认
export function msgConfirm(title = '您是否确认执行此操作? ') {
  return new Promise((resolve, reject) => {
    ElMessageBox.confirm(
      title,
      "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      }
    ).then((res) => {
      resolve(res)
    }).catch((err) => {
      reject(err)
    })
  })

}