/** Gemeinsame Typen für den Geo-Workstream (rein, keine DB-/IO-Abhängigkeit). */

export type Coordinates = { lat: number; lng: number };

export type RoutingMode = "osrm" | "haversine";

export type EtaResult = {
  durationSec: number | null;
  distanceMeters: number | null;
  mode: RoutingMode;
  isFallback: boolean;
};

export type OrderedResult<T> = T & { eta: EtaResult };

/** Ein Suchtreffer, der bereits mit den Koordinaten seiner Wehr angereichert ist. */
export type GeoCandidate = { brigadeCoords: Coordinates | null };

/** Ergebnis einer Geokodierung (rein; siehe nominatim.ts). */
export type GeocodeResult =
  | { status: "ok"; coords: Coordinates; displayName: string }
  | { status: "not_found" }
  | { status: "error"; reason: string };

/**
 * Rückgabe einer OSRM-`/table`-Abfrage mit `sources=0`.
 * `durations[0][i]` ist die Fahrzeit (Sekunden) von der Quelle zum i-ten Ziel,
 * `distances[0][i]` die Strecke (Meter). Einträge können `null` sein.
 */
export type OsrmTableResult = {
  durations: (number | null)[][];
  distances: (number | null)[][];
};

/** Injizierbare OSRM-Tabellenfunktion (für Tests mockbar). */
export type EtaTableFn = (
  origin: Coordinates,
  destinations: Coordinates[],
) => Promise<OsrmTableResult>;
