import { isTauri } from '@tauri-apps/api/core';
import { LogicalPosition, getCurrentWindow } from '@tauri-apps/api/window';

const IS_TAURI = isTauri();

// 获取当前窗口实例
const currentWindow = IS_TAURI ? getCurrentWindow?.() : null;

/** 鼠标初始X坐标 */
let startMouseX = 0;
/** 鼠标初始Y坐标 */
let startMouseY = 0;

/** 当前触摸ID */
let activeTouchId: number | null = null;
/** 触摸初始X坐标 */
let startTouchX = 0;
/** 触摸初始Y坐标 */
let startTouchY = 0;

/** 窗口初始X坐标 */
export const startWindowX = ref(0);
/** 窗口初始Y坐标 */
export const startWindowY = ref(0);

/*******************************     鼠标     ********************************************************/
/*******************************     鼠标     ********************************************************/
/*******************************     鼠标     ********************************************************/
/*******************************     鼠标     ********************************************************/

/**
 * 鼠标移动事件处理函数 - 更新窗口位置
 * @param event - 鼠标事件
 */
function mouseMoveHandler(event: MouseEvent) {
  // 阻止默认行为
  event.preventDefault();

  // 计算位置偏移
  const deltaX = event.screenX - startMouseX;
  const deltaY = event.screenY - startMouseY;

  // 计算新位置
  const newX = startWindowX.value + deltaX;
  const newY = startWindowY.value + deltaY;

  // 使用Tauri API直接移动窗口，保持与outerPosition()返回类型一致
  currentWindow?.setPosition(new LogicalPosition(newX, newY));
  if (Math.abs(deltaX) > 4 || Math.abs(deltaY) > 4) {
    // 移除事件监听器

    document.removeEventListener('mousemove', mouseMoveHandler);
    document.removeEventListener('mouseup', mouseUpHandler);
    currentWindow?.startDragging();
  }
}

/**
 * 鼠标释放事件处理函数 - 结束拖动
 * @param event - 鼠标事件
 */
function mouseUpHandler() {
  // 移除事件监听器
  document.removeEventListener('mousemove', mouseMoveHandler);
  document.removeEventListener('mouseup', mouseUpHandler);
}

/**
 * 鼠标按下事件处理函数 - 开始拖动窗口
 * @param event - 鼠标事件
 */
export async function handleMouseDown(event: MouseEvent, isAll = false) {
  if (!currentWindow) {
    return;
  }
  const target = event.target as HTMLElement;

  // 确保只处理左键点击 且 目标元素包含 global-move-windows 类 除非 isAll 为 true
  if (event.button === 0 && (isAll || target.classList.contains('global-move-windows'))) {
    // 阻止默认行为，防止事件冒泡
    event.preventDefault();
    try {
      // 获取缩放因子 （用于将物理像素映射到逻辑像素）
      const factor = await currentWindow.scaleFactor();
      // 获取窗口当前位置，使用outerPosition()替代getPosition()
      const windowPhysicalPosition = await currentWindow.outerPosition();
      // 转换为逻辑像素位置
      const windowPosition = windowPhysicalPosition.toLogical(factor);

      // 记录窗口初始位置
      startWindowX.value = windowPosition.x;
      startWindowY.value = windowPosition.y;

      // 记录鼠标初始位置
      startMouseX = event.screenX;
      startMouseY = event.screenY;

      // 添加鼠标移动和释放事件监听器
      document.addEventListener('mousemove', mouseMoveHandler);
      document.addEventListener('mouseup', mouseUpHandler);
    } catch (error: any) {
      console.error('获取窗口位置失败:', error);
    }
  }
}

/*******************************     触摸     ********************************************************/
/*******************************     触摸     ********************************************************/
/*******************************     触摸     ********************************************************/
/*******************************     触摸     ********************************************************/

/**
 * 触摸移动事件处理函数 - 更新窗口位置
 * @param event - 触摸事件
 */
function touchMoveHandler(event: TouchEvent) {
  if (activeTouchId === null || !currentWindow) {
    return;
  }

  // 阻止默认行为，避免页面滚动
  event.preventDefault();

  // 找到对应的触摸点，确保是同一个手指（通过触摸ID判断）
  const touch = Array.from(event.touches).find((t) => t.identifier === activeTouchId);

  // 如果找不到匹配的触摸点（手指已经离开或更换了手指），则不执行拖动操作
  if (touch) {
    // 计算位置偏移
    const deltaX = touch.screenX - startTouchX;
    const deltaY = touch.screenY - startTouchY;

    // 计算新位置
    const newX = startWindowX.value + deltaX;
    const newY = startWindowY.value + deltaY;

    // 使用Tauri API直接移动窗口
    currentWindow.setPosition(new LogicalPosition(newX, newY));
    if (Math.abs(deltaX) > 6 || Math.abs(deltaY) > 6) {
      // 移除事件监听器
      document.removeEventListener('touchmove', touchMoveHandler);
      document.removeEventListener('touchend', touchEndHandler);
      document.removeEventListener('touchcancel', touchEndHandler);
      currentWindow.startDragging();
    }
  }
}

/**
 * 触摸结束事件处理函数 - 结束拖动
 * @param event - 触摸事件
 */
function touchEndHandler(event: TouchEvent) {
  if (activeTouchId === null) {
    return;
  }

  // 检查结束的触摸点是否是我们正在跟踪的触摸点
  const endedTouchId = event.changedTouches[0]?.identifier;
  if (endedTouchId === activeTouchId) {
    activeTouchId = null;

    // 移除事件监听器
    document.removeEventListener('touchmove', touchMoveHandler);
    document.removeEventListener('touchend', touchEndHandler);
    document.removeEventListener('touchcancel', touchEndHandler);
  }
}

/**
 * 触摸开始事件处理函数 - 开始拖动窗口
 * @param event - 触摸事件
 */
export async function handleTouchStart(event: TouchEvent, isAll = false) {
  if (!currentWindow) {
    return;
  }
  const target = event.target as HTMLElement;

  // 确保只有一个触摸点 且 目标元素包含 global-move-windows 类 除非 isAll 为 true
  if (event.touches.length === 1 && (isAll || target.classList.contains('global-move-windows'))) {
    // 阻止默认行为，防止页面滚动
    event.preventDefault();

    const touch = event.touches[0]!;

    // 记录触摸点ID，用于后续判断是否是同一个手指
    const touchId = touch.identifier;

    try {
      const factor = await currentWindow.scaleFactor();
      // 获取窗口当前位置，使用outerPosition()替代getPosition()
      const windowPhysicalPosition = await currentWindow.outerPosition();
      // 转换为逻辑像素位置
      const windowPosition = windowPhysicalPosition.toLogical(factor);

      // 记录窗口初始位置
      startWindowX.value = windowPosition.x;
      startWindowY.value = windowPosition.y;

      // 记录触摸初始位置和ID
      startTouchX = touch.screenX;
      startTouchY = touch.screenY;
      activeTouchId = touchId;

      // 添加触摸移动和结束事件监听器
      document.addEventListener('touchmove', touchMoveHandler);
      document.addEventListener('touchend', touchEndHandler);
      document.addEventListener('touchcancel', touchEndHandler);
    } catch (error: any) {
      console.error('获取窗口位置失败:', error);
      activeTouchId = null;
    }
  }
}
