import Taro from "@tarojs/taro";

/* 获取图片信息
 * @param {string} tempFilePath 图片路径
 * @returns 图片信息
 */
export async function getImgInfo(tempFilePath) {
  try {
    let image = await new Promise((resolve, reject) => {
      Taro.getImageInfo({
        src: tempFilePath,
        success(res) {
          let imgInfo = {
            type: res.type,
            height: res.height,
            width: res.width,
            path: res.path,
          };
          resolve(imgInfo);
        },
        fail(err) {
          reject(err);
        },
      });
    });
    return image;
  } catch (err) {
    console.log(err);
  }
}

/**
 * 图片压缩
 * @param {object} file 图片信息：width、height、type、path
 * @param {string} canvasId canvas的id名
 * @param {object} config 限制最大宽高
 * @returns 压缩完成后的图片path
 */
export async function contraction(
  file,
  canvasId,
  // config = { maxWidth: 2048, maxHeight: 1536 }
  config = { maxWidth: 1024, maxHeight: 768 }
) {
  try {
    let ctxInfo = await new Promise((resolve, reject) => {
      // 获取图片原始宽高
      let width = file.width;
      let height = file.height;

      // 计算图片当前大小和目标大小的比例：目标大小 / 图片当前大小
      // 根据比例调整图片的尺寸：
      // 新宽度 = 原始宽度 * √(目标大小 / 图片当前大小)
      // 新高度 = 原始高度 * √(目标大小 / 图片当前大小)
      // 宽高同比例调整
      // 宽度 > 最大限宽 -> 重置尺寸
      if (width > config.maxWidth) {
        const ratio = config.maxWidth / width;
        width = config.maxWidth;
        height = height * ratio;
      }
      // 高度 > 最大限高度 -> 重置尺寸
      if (height > config.maxHeight) {
        const ratio = config.maxHeight / height;
        width = width * ratio;
        height = config.maxHeight;
      }

      // 获取canvas元素
      const query = Taro.createSelectorQuery();
      let dom = query.select(`#${canvasId}`);
      dom.fields({ node: true, size: true }).exec((res) => {
        // Canvas 对象
        const canvas = res[0].node;
        // 渲染上下文
        const ctx = canvas.getContext("2d");

        // 根据设备像素比处理尺寸 = 大小 * 设备像素
        const dpr = Taro.getSystemInfoSync().pixelRatio;
        canvas.width = width * dpr;
        canvas.height = height * dpr;
        ctx.scale(dpr, dpr);

        //创建img对象
        let img = canvas.createImage();
        img.src = file.path; // 给图片添加路径
        //图片加载完毕
        img.onload = function () {
          // 将图片绘制到 canvas
          ctx.drawImage(img, 0, 0, width, height);
          // 生成图片
          Taro.canvasToTempFilePath({
            canvas,
            x: 0,
            y: 0,
            destWidth: width,
            destHeight: height,
            success(res) {
              resolve(res); // 生成临时文件路径
            },
          });
        };
      });
    });
    return ctxInfo;
  } catch (err) {
    console.log(err);
  }
}
