import { ref, computed } from 'vue'

/**
 * 地图编辑器当前激活工具的状态机。每次工具切换会把 EditToolRail 按钮高亮、
 * 状态栏文字与 Canvas iframe 内的鼠标行为联动。
 *
 * 工具切换有两个层面：
 * - **前端切换**：仅影响 Vue 端的按钮高亮 + 状态栏 + 下一次画布点击的本地处理（如 pick 后调反射 API 创建对象）。
 * - **后端切换**：通过反射 API `/execute/...` 触发 SimpleLite 的 CAD action（吸附 / 对齐 / 框选等）。
 *
 * 简化起见：本 composable 只负责前端状态，CAD action 由调用方决定何时触发。
 */

export type EditToolId =
  // 选择组（左侧仅保留「仅*」过滤；单选/框选等由画布默认交互承担）
  | 'select.single'
  | 'select.rect'
  | 'select.lasso'
  | 'select.byType.site'
  | 'select.byType.straight'
  | 'select.byType.curve'
  | 'select.byType.bezier'
  | 'select.byType.polyline'
  | 'select.byType.arc'
  | 'select.byType.decor'
  | 'select.byType.currentLayer'
  | 'select.invert'
  | 'select.clear'
  // 绘制组
  | 'draw.site'
  | 'draw.sites.continuous'
  | 'draw.track.polyline'
  | 'draw.tracks.continuous'
  | 'draw.track.bezier'
  | 'draw.track.arc'
  | 'draw.track.nurbs'
  | 'draw.decor.line'
  | 'draw.decor.rect'
  | 'draw.decor.circle'
  | 'draw.decor.text'
  | 'draw.image'
  | 'draw.model'
  // 变换组
  | 'transform.move'
  | 'transform.rotate'
  | 'transform.scale'
  | 'transform.copy'
  | 'transform.paste'
  | 'transform.delete'
  | 'transform.copyFields'
  // 对齐组
  | 'align.left'
  | 'align.right'
  | 'align.top'
  | 'align.bottom'
  | 'align.centerH'
  | 'align.centerV'
  | 'align.center'
  | 'align.distributeH'
  | 'align.distributeV'
  | 'align.toFirst'
  | 'align.toLast'
  // 批量生成
  | 'batch.linearH'
  | 'batch.linearV'
  | 'batch.matrix'
  | 'batch.alongPath'
  | 'batch.circular'
  // 吸附 / 辅助
  | 'snap.grid'
  | 'snap.object'
  | 'snap.endpoint'
  | 'snap.midpoint'
  | 'show.controlPoints'
  | 'show.controlHandles'

export interface SnapState {
  grid: boolean
  gridSizeMm: number
  object: boolean
  endpoint: boolean
  midpoint: boolean
  toAngleDeg?: number
}

export function useEditTool() {
  // 空闲默认：不落在已移除的「移动」上，侧栏无高亮（画布仍可点选）。
  const activeTool = ref<EditToolId>('select.single')
  const snap = ref<SnapState>({ grid: false, gridSizeMm: 100, object: true, endpoint: true, midpoint: false, toAngleDeg: undefined })
  const showControlPoints = ref(true)
  const showControlHandles = ref(true)

  /** 当前画布行为类别（用于状态栏 / 鼠标光标 hint）。 */
  const toolCategory = computed<'select' | 'draw' | 'transform' | 'align' | 'batch' | 'snap' | 'show'>(() => {
    const id = activeTool.value
    if (id.startsWith('select.')) return 'select'
    if (id.startsWith('draw.')) return 'draw'
    if (id.startsWith('transform.')) return 'transform'
    if (id.startsWith('align.')) return 'align'
    if (id.startsWith('batch.')) return 'batch'
    if (id.startsWith('snap.')) return 'snap'
    return 'show'
  })

  /** 当前工具的人类可读名称（状态栏展示）。 */
  const toolLabel = computed(() => {
    const map: Record<EditToolId, string> = {
      'select.single': '单选',
      'select.rect': '矩形框选',
      'select.lasso': '圈选',
      'select.byType.site': '仅站点',
      'select.byType.straight': '仅直线',
      'select.byType.curve': '仅曲线',
      'select.byType.bezier': '仅曲线',
      'select.byType.polyline': '仅直线',
      'select.byType.arc': '仅曲线',
      'select.byType.decor': '仅装饰',
      'select.byType.currentLayer': '当前图层',
      'select.invert': '反选',
      'select.clear': '清空选中',
      'draw.site': '添加站点',
      'draw.sites.continuous': '连续添加站点',
      'draw.track.polyline': '添加直线路径',
      'draw.tracks.continuous': '连续添加直线路径',
      'draw.track.bezier': '添加贝塞尔路径',
      'draw.track.arc': '添加弧形路径',
      'draw.track.nurbs': '添加 NURBS 路径',
      'draw.decor.line': '添加线段',
      'draw.decor.rect': '添加矩形',
      'draw.decor.circle': '添加圆',
      'draw.decor.text': '添加文本',
      'draw.image': '插入图片',
      'draw.model': '插入 3D 模型',
      'transform.move': '移动',
      'transform.rotate': '旋转',
      'transform.scale': '缩放',
      'transform.copy': '复制',
      'transform.paste': '粘贴',
      'transform.delete': '删除',
      'transform.copyFields': '复制字段',
      'align.left': '左对齐',
      'align.right': '右对齐',
      'align.top': '上对齐',
      'align.bottom': '下对齐',
      'align.centerH': '水平居中',
      'align.centerV': '垂直居中',
      'align.center': '整体居中',
      'align.distributeH': '水平等距',
      'align.distributeV': '垂直等距',
      'align.toFirst': '对齐到第一个',
      'align.toLast': '对齐到最后一个',
      'batch.linearH': '横向间隔生成',
      'batch.linearV': '纵向间隔生成',
      'batch.matrix': '矩阵生成',
      'batch.alongPath': '沿路径采样生成',
      'batch.circular': '环形阵列',
      'snap.grid': '网格吸附',
      'snap.object': '对象吸附',
      'snap.endpoint': '端点吸附',
      'snap.midpoint': '中点吸附',
      'show.controlPoints': '显示控制点',
      'show.controlHandles': '显示控制柄'
    }
    return map[activeTool.value] ?? activeTool.value
  })

  function setTool(id: EditToolId) {
    activeTool.value = id
  }

  function toggleSnap(key: 'grid' | 'object' | 'endpoint' | 'midpoint') {
    snap.value = { ...snap.value, [key]: !snap.value[key] }
  }

  return {
    activeTool,
    snap,
    showControlPoints,
    showControlHandles,
    toolCategory,
    toolLabel,
    setTool,
    toggleSnap
  }
}
