import { ref } from 'vue'
import * as Cesium from 'cesium'

/**
 * 地图 Tooltip 状态管理（性能优化版）
 * 用于显示地图标记点的轻量级信息提示框
 *
 * 性能优化：
 * 1. 只在 tooltip 可见时注册 postRender 监听器
 * 2. 缓存地形高度计算结果
 * 3. 使用节流避免过度更新
 */
export function useMapTooltip() {
  // Tooltip 状态
  const tooltipState = ref({
    visible: false,
    x: 0,
    y: 0,
    title: '',
    icon: '',
    zIndex: 20,
    data: null // 业务数据，用于内容插槽渲染
  })

  // 当前跟踪的实体
  const currentEntity = ref(null)

  // postRender 监听器移除函数
  let removePostRenderListener = null

  // 地形高度缓存（避免重复采样）
  const terrainHeightCache = new Map()

  /**
   * 显示 Tooltip
   * @param {Object} options - Tooltip 配置选项
   * @param {number} options.x - 屏幕 X 坐标（像素）
   * @param {number} options.y - 屏幕 Y 坐标（像素）
   * @param {string} [options.title=''] - Tooltip 标题文本
   * @param {string} [options.icon=''] - 标题左侧图标的图片路径
   * @param {Object} [options.data=null] - 业务数据
   * @param {Cesium.Entity} [options.entity=null] - 关联的实体（用于位置跟踪）
   */
  const showTooltip = ({ x, y, title = '', icon = '', data = null, entity = null }) => {
    tooltipState.value = {
      visible: true,
      x,
      y,
      title,
      icon,
      zIndex: 20,
      data
    }

    // 保存关联的实体
    currentEntity.value = entity
  }

  /**
   * 隐藏 Tooltip
   */
  const hideTooltip = () => {
    tooltipState.value.visible = false
    currentEntity.value = null

    // 移除 postRender 监听器（性能优化）
    if (removePostRenderListener) {
      removePostRenderListener()
      removePostRenderListener = null
    }

    // 清空地形高度缓存
    terrainHeightCache.clear()
  }

  /**
   * 更新 Tooltip 位置
   * @param {number} x - 屏幕 X 坐标
   * @param {number} y - 屏幕 Y 坐标
   */
  const updateTooltipPosition = (x, y) => {
    if (tooltipState.value.visible) {
      tooltipState.value.x = x
      tooltipState.value.y = y
    }
  }

  /**
   * 启用实体位置跟踪（性能优化版）
   * 只在 tooltip 可见时注册 postRender 监听器
   *
   * @param {Cesium.Viewer} viewer - Cesium viewer 实例
   * @param {Function} registerPostRenderFn - 注册 postRender 的函数（来自 useCesiumLifecycle）
   */
  const enableEntityTracking = (viewer, registerPostRenderFn) => {
    if (!viewer || !registerPostRenderFn) {
      console.warn('[useMapTooltip] 无效的 viewer 或 registerPostRenderFn')
      return
    }

    // 如果已经有监听器，先移除
    if (removePostRenderListener) {
      removePostRenderListener()
    }

    // 创建更新回调（带缓存优化）
    const updateCallback = () => {
      if (!currentEntity.value || !tooltipState.value.visible) {
        return
      }

      const entity = currentEntity.value
      const position = entity.position?.getValue(Cesium.JulianDate.now())

      if (!position) return

      // 获取地形高度（带缓存）
      const cartographic = Cesium.Cartographic.fromCartesian(position)
      const cacheKey = `${cartographic.longitude.toFixed(6)}_${cartographic.latitude.toFixed(6)}`

      let clampedPosition = position

      if (!terrainHeightCache.has(cacheKey)) {
        // 首次采样，缓存结果
        if (viewer.scene.globe) {
          const height = viewer.scene.globe.getHeight(cartographic)
          if (Cesium.defined(height)) {
            cartographic.height = height
            clampedPosition = Cesium.Cartographic.toCartesian(cartographic)
            terrainHeightCache.set(cacheKey, clampedPosition)
          }
        }
      } else {
        // 使用缓存的高度
        clampedPosition = terrainHeightCache.get(cacheKey)
      }

      // 转换为屏幕坐标
      const canvasPosition = viewer.scene.cartesianToCanvasCoordinates(clampedPosition)

      // 如果标记点在视野外，隐藏 tooltip
      if (!Cesium.defined(canvasPosition)) {
        hideTooltip()
        return
      }

      // 计算容器偏移，将 canvas 本地坐标转换为视口坐标
      const canvas = viewer.scene.canvas
      const containerRect = canvas.getBoundingClientRect()
      const viewportX = canvasPosition.x + containerRect.left
      const viewportY = canvasPosition.y + containerRect.top

      // 更新位置（使用视口坐标）
      updateTooltipPosition(viewportX, viewportY)
    }

    // 注册监听器
    removePostRenderListener = registerPostRenderFn(viewer.scene, updateCallback)
  }

  /**
   * 禁用实体位置跟踪
   */
  const disableEntityTracking = () => {
    if (removePostRenderListener) {
      removePostRenderListener()
      removePostRenderListener = null
    }
    terrainHeightCache.clear()
  }

  return {
    tooltipState,
    currentEntity,
    showTooltip,
    hideTooltip,
    updateTooltipPosition,
    enableEntityTracking,
    disableEntityTracking
  }
}
