/**
 * 绘制裁剪框
 * @param mouseX 鼠标x轴坐标
 * @param mouseY 鼠标y轴坐标
 * @param width 裁剪框宽度
 * @param height 裁剪框高度
 * @param context 需要进行绘制的canvas画布
 * @param borderSize 边框节点直径
 * @param controller 需要进行操作的canvas容器
 * @param imageController 图片canvas容器
 * @private
 */
import { imgScaling } from "@/module/common-methords/ImgScaling";
import PlugInParameters from "@/module/main-entrance/PlugInParameters";

export function drawCutOutBox(
  mouseX: number,
  mouseY: number,
  width: number,
  height: number,
  context: CanvasRenderingContext2D,
  borderSize: number,
  controller: HTMLCanvasElement,
  imageController: HTMLCanvasElement,
  drawBorders = true
) {
  // 获取画布宽高
  const canvasWidth = controller?.width;
  const canvasHeight = controller?.height;
  const plugInParameters = new PlugInParameters();

  // 画布、图片不存在则return
  if (!canvasWidth || !canvasHeight || !imageController || !controller) return;

  // 清除画布
  context.clearRect(0, 0, canvasWidth, canvasHeight);

  // 绘制蒙层
  context.save();
  context.fillStyle = "rgba(0, 0, 0, .6)";
  context.fillRect(0, 0, canvasWidth, canvasHeight);
  // 将蒙层凿开
  context.globalCompositeOperation = "source-atop";
  // 裁剪选择框
  context.clearRect(mouseX, mouseY, width, height);
  // 绘制8个边框像素点并保存坐标信息以及事件参数
  context.globalCompositeOperation = "source-over";
  context.fillStyle = "#2CABFF";
  // 是否绘制裁剪框的8个像素点
  if (drawBorders) {
    // 像素点大小
    const size = borderSize;
    // 绘制像素点
    context.fillRect(mouseX - size / 2, mouseY - size / 2, size, size);
    context.fillRect(
      mouseX - size / 2 + width / 2,
      mouseY - size / 2,
      size,
      size
    );
    context.fillRect(mouseX - size / 2 + width, mouseY - size / 2, size, size);
    context.fillRect(
      mouseX - size / 2,
      mouseY - size / 2 + height / 2,
      size,
      size
    );
    context.fillRect(
      mouseX - size / 2 + width,
      mouseY - size / 2 + height / 2,
      size,
      size
    );
    context.fillRect(mouseX - size / 2, mouseY - size / 2 + height, size, size);
    context.fillRect(
      mouseX - size / 2 + width / 2,
      mouseY - size / 2 + height,
      size,
      size
    );
    context.fillRect(
      mouseX - size / 2 + width,
      mouseY - size / 2 + height,
      size,
      size
    );
  }
  // 绘制结束
  context.restore();
  // 使用drawImage将图片绘制到蒙层下方
  context.save();

  // 获取图片canvas容器的宽高信息
  // const imgWidth = imageController.width;
  // const imgHeight = imageController.height;
  // // 修改图片canvas容器的宽高，用原宽高 * 当前设备的像素比，解决模糊问题
  // imageController.width = imgWidth * window.devicePixelRatio;
  // imageController.height =
  //   imgHeight * window.devicePixelRatio;
  // imageController.style.width = imgWidth + "px";
  // imageController.style.height = imgHeight + "px";
  // context.scale(window.devicePixelRatio, window.devicePixelRatio);

  context.globalCompositeOperation = "destination-over";
  let { imgWidth, imgHeight } = {
    imgWidth: controller?.width,
    imgHeight: controller?.height
  };
  if (plugInParameters.getWebRtcStatus()) {
    // 计算等比例缩放后的图片宽高
    // const { tempWidth, tempHeight } = imgScaling(
    //   window.screen.width,
    //   window.screen.height,
    //   controller.width,
    //   controller.height
    // );
    // imgWidth = tempWidth;
    // imgHeight = tempHeight;
    // 使用当前屏幕宽高
    imgWidth = window.screen.width;
    imgHeight = window.screen.height;
  }

  context.drawImage(imageController, 0, 0, imgWidth, imgHeight);
  context.restore();
  // 返回裁剪框临时位置信息
  if (width > 0 && height > 0) {
    // 考虑左上往右下拉区域的情况
    return {
      startX: mouseX,
      startY: mouseY,
      width: width,
      height: height
    };
  } else if (width < 0 && height < 0) {
    // 考虑右下往左上拉区域的情况
    return {
      startX: mouseX + width,
      startY: mouseY + height,
      width: Math.abs(width),
      height: Math.abs(height)
    };
  } else if (width > 0 && height < 0) {
    // 考虑左下往右上拉区域的情况
    return {
      startX: mouseX,
      startY: mouseY + height,
      width: width,
      height: Math.abs(height)
    };
  } else if (width < 0 && height > 0) {
    // 考虑右上往左下拉区域的情况
    return {
      startX: mouseX + width,
      startY: mouseY,
      width: Math.abs(width),
      height: height
    };
  }
  return {
    startX: mouseX,
    startY: mouseY,
    width: width,
    height: height
  };
}
