import { ref } from 'vue'
import type { SelectionItem } from './useSelection'

/**
 * 编辑器剪贴板：保存最近一次「复制」操作的对象快照（含字段值），
 * 用于「粘贴 (Ctrl+V)」与「复制字段 (Copy Fields)」。
 *
 * 粘贴策略：调用方在拿到目标坐标后，用 mapEditApi.batch 创建副本（带偏移）。
 * 复制字段：调用方调 mapEditApi.copyFieldsTo 把指定字段名写到目标对象（们）。
 *
 * 注意：剪贴板里保存的是对象的"逻辑快照"，不是 DOM 文本剪贴板。
 */

export interface ClipboardSnapshot {
  items: Array<{
    kind: string
    sourceId: number
    typeName: string
    /** 对象的几何 / 样式字段（含 x, y 用于偏移粘贴）。 */
    fields: Record<string, string>
  }>
  fieldNames: string[]
}

export function useClipboard() {
  const data = ref<ClipboardSnapshot | null>(null)

  function copy(items: SelectionItem[], allFields: Record<number, Record<string, string>>) {
    if (items.length === 0) {
      data.value = null
      return
    }
    const fieldNamesSet = new Set<string>()
    const snapshot: ClipboardSnapshot = {
      items: items.map((it) => {
        const f = allFields[it.id] ?? {}
        Object.keys(f).forEach((k) => fieldNamesSet.add(k))
        return {
          kind: it.kind,
          sourceId: it.id,
          typeName: it.typeName,
          fields: f
        }
      }),
      fieldNames: []
    }
    snapshot.fieldNames = [...fieldNamesSet]
    data.value = snapshot
  }

  function clear() {
    data.value = null
  }

  return { data, copy, clear }
}
