const SYNC_KEY = '_kestrelMarkerSync'

const pointFeatures = (features, keyFor) => (features ?? [])
  .filter(f => f?.geometry?.type === 'Point')
  .map(f => ({ feature: f, key: keyFor(f) }))
  .filter(({ key }) => key != null)

export function syncFeatureMarkers(layer, features, { keyFor, create, update }) {
  const prev = layer[SYNC_KEY] ?? new Map()
  const next = pointFeatures(features, keyFor).reduce((map, { feature, key }) => {
    const existing = prev.get(key)
    if (existing) {
      update(existing, feature)
      return new Map([...map, [key, existing]])
    }
    const marker = create(feature)
    layer.addLayer(marker)
    return new Map([...map, [key, marker]])
  }, new Map())

  Array.from(prev.entries())
    .filter(([key]) => !next.has(key))
    .forEach(([, marker]) => layer.removeLayer(marker))

  layer[SYNC_KEY] = next
}

export function clearFeatureMarkers(layer) {
  if (!layer) return
  const prev = layer[SYNC_KEY]
  if (prev) {
    Array.from(prev.values()).forEach(marker => layer.removeLayer(marker))
    layer[SYNC_KEY] = new Map()
    return
  }
  layer.clearLayers()
}
