/**
 * FEAT-4: API-gestützte PedigreeSource mit Cache.
 *
 * Der Cache lebt so lange wie die Stammbaum-Seite gemountet ist und bleibt
 * beim Umwurzeln (Tipp auf eine Karte) erhalten — gemeinsame Vorfahren werden
 * nur einmal geladen, der Wechsel fühlt sich dadurch unmittelbar an.
 *
 * 404 → null („unbekannt“); andere Fehler werden NICHT gecacht (erneuter
 * Versuch möglich) und an den Aufrufer durchgereicht.
 */
import { ApiError } from '../api/client'
import { getGerbil } from '../api/gerbils'
import { getLitter } from '../api/litters'
import type { Gerbil, Litter } from '../api/types'
import type { PedigreeSource } from './types'

function cached<T>(load: (id: string) => Promise<T>): (id: string) => Promise<T | null> {
  const cache = new Map<string, Promise<T | null>>()
  return (id: string) => {
    let entry = cache.get(id)
    if (!entry) {
      entry = load(id).catch((err: unknown) => {
        if (err instanceof ApiError && err.status === 404) return null
        cache.delete(id)
        throw err
      })
      cache.set(id, entry)
    }
    return entry
  }
}

export function createApiPedigreeSource(): PedigreeSource {
  return {
    getGerbil: cached<Gerbil>(getGerbil),
    getLitter: cached<Litter>(getLitter),
  }
}
