/**
 * 多地图连接（跨楼层 / 多地图拼接）数据层。
 *
 * 业务背景：一个站点可作为「切换点站点」与另一张地图的某个切换点站点相连，
 * 配上转移代价（cm），即可在多张楼层地图之间做跨图路径规划与地图拼接。
 *
 * 持久化：后端暂无对应表，先用 localStorage 落地，保证前端功能完整、可演示；
 * 待后端补上 `/sl/projection/map-edit/connections` 系列接口后，仅需替换本文件实现，
 * 组件层（MapConnectionPanel）无需改动（接口已按异步 Promise 设计）。
 */

export interface MapConnection {
  id: number
  /** 起始地图名称（与 mapsApi.list 的 name 对齐） */
  sourceMap: string
  /** 起始地图 ID（地图以名称为主键，这里按名称分配稳定数字 ID，呼应参考图的「地图ID」列） */
  sourceMapId: number
  /** 起始切换点站点 */
  sourceStation: string
  /** 目的地图名称 */
  targetMap: string
  /** 目的地图 ID */
  targetMapId: number
  /** 目的切换点站点 */
  targetStation: string
  /** 转移代价（cm） */
  cost: number
}

export type MapConnectionInput = Omit<MapConnection, 'id' | 'sourceMapId' | 'targetMapId'>

const LS_KEY = 'mapEditor.mapConnections.v1'
const LS_IDREG = 'mapEditor.mapIdRegistry.v1'

function readAll(): MapConnection[] {
  try {
    const raw = localStorage.getItem(LS_KEY)
    if (!raw) return []
    const arr = JSON.parse(raw)
    return Array.isArray(arr) ? (arr as MapConnection[]) : []
  } catch {
    return []
  }
}

function writeAll(list: MapConnection[]): void {
  localStorage.setItem(LS_KEY, JSON.stringify(list))
}

function readReg(): Record<string, number> {
  try {
    return (JSON.parse(localStorage.getItem(LS_IDREG) ?? '{}') as Record<string, number>) || {}
  } catch {
    return {}
  }
}

function writeReg(reg: Record<string, number>): void {
  localStorage.setItem(LS_IDREG, JSON.stringify(reg))
}

/** 名称 → 稳定数字 ID：首次遇到某地图名时分配一个递增 ID，并持久化，保证后续一致。 */
export function mapIdOf(name: string): number {
  if (!name) return 0
  const reg = readReg()
  if (reg[name] != null) return reg[name]
  const next = Object.values(reg).reduce((m, v) => Math.max(m, v), 0) + 1
  reg[name] = next
  writeReg(reg)
  return next
}

// 模拟一点点网络延迟，让 loading 态自然，也方便日后替换为真实 http 调用。
function later<T>(value: T): Promise<T> {
  return new Promise((resolve) => setTimeout(() => resolve(value), 60))
}

export const mapConnectionApi = {
  /** 列出全部连接（按 id 倒序，新建的在前）。 */
  list(): Promise<MapConnection[]> {
    return later(readAll().slice().sort((a, b) => b.id - a.id))
  },

  create(input: MapConnectionInput): Promise<MapConnection> {
    const list = readAll()
    const id = list.reduce((m, c) => Math.max(m, c.id), 0) + 1
    const rec: MapConnection = {
      id,
      ...input,
      sourceMapId: mapIdOf(input.sourceMap),
      targetMapId: mapIdOf(input.targetMap)
    }
    list.push(rec)
    writeAll(list)
    return later(rec)
  },

  update(id: number, input: MapConnectionInput): Promise<MapConnection> {
    const list = readAll()
    const idx = list.findIndex((c) => c.id === id)
    if (idx < 0) return Promise.reject(new Error('连接不存在或已被删除'))
    const rec: MapConnection = {
      id,
      ...input,
      sourceMapId: mapIdOf(input.sourceMap),
      targetMapId: mapIdOf(input.targetMap)
    }
    list[idx] = rec
    writeAll(list)
    return later(rec)
  },

  remove(id: number): Promise<{ id: number; deleted: boolean }> {
    writeAll(readAll().filter((c) => c.id !== id))
    return later({ id, deleted: true })
  },

  /** 历史用过的切换点站点名，给「切换点站点」下拉做候选（可继续手动输入新名）。 */
  stationSuggestions(): string[] {
    const set = new Set<string>()
    for (const c of readAll()) {
      if (c.sourceStation) set.add(c.sourceStation)
      if (c.targetStation) set.add(c.targetStation)
    }
    return Array.from(set)
  }
}
