/* ================================================================
   Typen der Home-Assistant-Schnittstelle und der Fachdaten
   ================================================================
   Die Fachtypen (Fahrt, Tankvorgang, ...) sind aus SPECIFICATION.md §5
   "Data files" abgeleitet - also aus dem, was das Backend tatsächlich in
   fahrten.jsonl / tankvorgaenge.jsonl schreibt, nicht aus Wunschdenken.
   Felder, die laut §7 im Schema stehen, aber von keinem Codepfad je gefüllt
   werden (start_lat, avg_speed_kmh, route, ...), sind hier bewusst als
   optional markiert - sie können null/undefined sein und die Oberfläche darf
   sich nie darauf verlassen. */

/** Roher Zustand einer HA-Entität, wie ihn /api/states liefert. */
export interface HassState<A = Record<string, unknown>> {
  entity_id: string;
  state: string;
  attributes: A;
  last_changed: string;
  last_updated: string;
  context?: { id: string; parent_id: string | null; user_id: string | null };
}

/** Die pyscript.*-Entitäten transportieren ihre Nutzlast im Attribut "daten". */
export interface DatenAttribute<T> {
  daten: T;
  [weitere: string]: unknown;
}

export type DatenEntity<T> = HassState<DatenAttribute<T>>;

/* ----------------------------------------------------------- Fachdaten */

export type Fahrtart = "privat" | "arbeitsweg";
export type FahrtStatus = "offen" | "vollständig";
export type FahrtQuelle = "ha" | "manual";

export interface Fahrt {
  trip_id: string;
  ts_start: string;
  ts_end: string;
  duration_s: number;
  distance_km: number | null;
  /** "odometer" ist der einzige Wert, den das Backend je erzeugt (§7.1). */
  km_quelle: "odometer" | "gps" | null;
  odo_start: number | null;
  odo_end: number | null;
  art: Fahrtart;
  source: FahrtQuelle;
  status: FahrtStatus;
  edited_fields?: string[];
  /* Ab FMM003 erstmals real befüllbar - bis dahin durchgehend null (§7.2). */
  avg_speed_kmh?: number | null;
  start_lat?: number | null;
  start_lon?: number | null;
  end_lat?: number | null;
  end_lon?: number | null;
  start_address?: string | null;
  end_address?: string | null;
  route?: unknown | null;
  pausen?: unknown[];
}

export type TankStatus = "unvollständig" | "vollständig";
export type TankQuelle = "auto" | "manual" | "beleg";

export interface Tankvorgang {
  tank_id: string;
  ts: string;
  liters: number | null;
  fuel_total_eur: number | null;
  /** Immer aus fuel_total_eur/liters berechnet, nie aus dem Beleg gelesen. */
  price_per_l: number | null;
  station_name?: string | null;
  station_id?: string | null;
  station_address?: string | null;
  fuel_type?: string | null;
  product_name?: string | null;
  discount?: number | null;
  discount_per_l?: number | null;
  list_price_per_l?: number | null;
  receipt_total_eur?: number | null;
  receipt_key?: string | null;
  receipt_no?: string | null;
  receipt_file?: string | null;
  odometer_km?: number | null;
  distance_km?: number | null;
  source: TankQuelle;
  status: TankStatus;
  edited_fields?: string[];
}

/** Einzelprüfung aus _sicherheitscheck: ok===null heißt "Sensor unbekannt". */
export interface SicherheitsPunkt {
  label: string;
  ok: boolean | null;
}

export interface Fahrzeugstatus {
  km?: number | null;
  tank_prozent?: number | null;
  reichweite_km?: number | null;
  sicher_abgestellt?: boolean | null;
  sicherheit?: SicherheitsPunkt[];
  [weitere: string]: unknown;
}

/** Das Profil ist ein großer, frei geformter JSON-Blob (§5). Die Oberfläche
    greift gezielt auf Abschnitte zu; ein vollständiger Typ wäre hier nur
    scheingenau, solange das Backend ihn nicht erzwingt. */
export interface Profil {
  fahrzeug?: Record<string, unknown>;
  einstellungen?: Record<string, unknown>;
  versicherung?: Record<string, unknown>;
  steuer?: Record<string, unknown>;
  reifen?: Record<string, unknown>;
  service?: Record<string, unknown>;
  technik?: Record<string, unknown>;
  ausstattung?: Record<string, unknown>;
  [weitere: string]: unknown;
}

/* -------------------------------------------------- Entitäts-Verzeichnis */

/** Alle vom Backend veröffentlichten pyscript-Entitäten an einer Stelle.
    Kein Hardcoding über die App verstreut: wer eine Entität umbenennt,
    ändert genau diese Tabelle. */
export const ENTITAETEN = {
  profil: "pyscript.audi_dashboard_profil",
  fahrten: "pyscript.audi_dashboard_fahrten",
  tankvorgaenge: "pyscript.audi_dashboard_tankvorgaenge",
  fahrzeugstatus: "pyscript.audi_dashboard_fahrzeugstatus",
  batterieverlauf: "pyscript.audi_dashboard_batterieverlauf",
  belegErgebnis: "pyscript.audi_dashboard_beleg_ergebnis",
  updateStatus: "pyscript.audi_dashboard_update_status",
} as const;

export type EntitaetsSchluessel = keyof typeof ENTITAETEN;
