import type { PoiCategory, PoiSummary } from '@/domain/poi'
import { describe, expect, it } from 'vitest'
import { buildMarkerIdMap, createPoiMarkers } from '@/services/map'

const categories: PoiCategory[] = [{
  code: 'park',
  name: '公园绿地',
  markerIcon: '/static/markers/park.png',
  selectedMarkerIcon: '/static/markers/park-selected.png',
  sortOrder: 1,
  status: 'enabled',
}]

function summary(id: string): PoiSummary {
  return {
    id,
    name: id,
    categoryCode: 'park',
    categoryName: '公园绿地',
    tagCodes: ['family'],
    tags: [{ code: 'family', name: '亲子友好', sortOrder: 1, status: 'enabled' }],
    longitude: 113.9,
    latitude: 22.7,
    coordinateSystem: 'GCJ02',
    coverImage: {
      id: 'cover',
      url: '/static/poi/placeholder.png',
      source: 'test',
      sourceReference: null,
      copyrightStatus: 'cleared',
      licenseEvidence: 'test',
      reviewedBy: 'test',
      reviewedAt: '2026-07-29T00:00:00Z',
      updatedAt: '2026-07-29T00:00:00Z',
      alt: 'test',
    },
    summary: 'test',
    description: 'test description',
    address: 'test address',
    recommendationIndex: 4,
    recommendationSource: 'official_editorial',
    openingHoursText: '开放时间待确认',
  }
}

describe('map marker adapter', () => {
  it('keeps numeric IDs stable when filter order changes', () => {
    const first = buildMarkerIdMap(['poi-b', 'poi-a'])
    const second = buildMarkerIdMap(['poi-a', 'poi-b'])
    expect(Array.from(first.entries())).toEqual(Array.from(second.entries()))
  })

  it('maps selected POI to selected marker asset', () => {
    const pois = [summary('poi-a'), summary('poi-b')]
    const map = buildMarkerIdMap(pois.map(poi => poi.id))
    const markers = createPoiMarkers(pois, categories, map, 'poi-b')
    const selectedMarkerId = Array.from(map.entries())
      .find(([, poiId]) => poiId === 'poi-b')?.[0]
    const selected = markers.find(marker => marker.id === selectedMarkerId)
    expect(selected?.iconPath).toBe('/static/markers/park-selected.png')
    expect(selected?.zIndex).toBe(10)
    expect(selected?.height).toBeGreaterThan(selected?.width ?? 0)
  })
})
