// =============================================================================
// Vehicle Fleet Management — Domain Model
// =============================================================================

// ── Enums ─────────────────────────────────────────────────────────────────────

export enum FahrzeugStatus {
  Einsatzbereit       = 'einsatzbereit',
  AusserDienstWartung = 'ausser_dienst_wartung',
  AusserDienstSchaden = 'ausser_dienst_schaden',
}

export const FahrzeugStatusLabel: Record<FahrzeugStatus, string> = {
  [FahrzeugStatus.Einsatzbereit]:       'Einsatzbereit',
  [FahrzeugStatus.AusserDienstWartung]: 'Außer Dienst (Wartung)',
  [FahrzeugStatus.AusserDienstSchaden]: 'Außer Dienst (Schaden)',
};

export type WartungslogArt =
  | '§57a Prüfung'
  | 'Service'
  | 'Sonstiges';

// ── Core Entities ─────────────────────────────────────────────────────────────

export interface AktiverLehrgang {
  titel:  string;
  beginn: Date;
  ende:   Date;
}

export interface Fahrzeug {
  id:                        string;
  bezeichnung:               string;
  kurzname:                  string | null;
  amtliches_kennzeichen:     string | null;
  fahrgestellnummer:         string | null;
  baujahr:                   number | null;
  hersteller:                string | null;
  typ_schluessel:            string | null;
  besatzung_soll:            string | null;
  status:                    FahrzeugStatus;
  status_bemerkung:          string | null;
  ausser_dienst_von:         Date | null;
  ausser_dienst_bis:         Date | null;
  standort:                  string;
  bild_url:                  string | null;
  paragraph57a_faellig_am:   Date | null;
  naechste_wartung_am:       Date | null;
  created_at:                Date;
  updated_at:                Date;
  aktiver_lehrgang?:         AktiverLehrgang | null;
}

export type WartungslogErgebnis =
  | 'bestanden'
  | 'bestanden_mit_maengeln'
  | 'nicht_bestanden';

export interface FahrzeugWartungslog {
  id:               string;
  fahrzeug_id:      string;
  datum:            Date;
  art:              WartungslogArt | null;
  beschreibung:     string;
  km_stand:         number | null;
  kraftstoff_liter: number | null;
  kosten:           number | null;
  externe_werkstatt: string | null;
  ergebnis:         WartungslogErgebnis | null;
  naechste_faelligkeit: Date | null;
  erfasst_von:      string | null;
  created_at:       Date;
}

// ── List Item (Grid / Card view) ──────────────────────────────────────────────

export interface FahrzeugListItem {
  id:                          string;
  bezeichnung:                 string;
  kurzname:                    string | null;
  amtliches_kennzeichen:       string | null;
  baujahr:                     number | null;
  hersteller:                  string | null;
  besatzung_soll:              string | null;
  status:                      FahrzeugStatus;
  status_bemerkung:            string | null;
  ausser_dienst_von:           Date | null;
  ausser_dienst_bis:           Date | null;
  bild_url:                    string | null;
  paragraph57a_faellig_am:     Date | null;
  paragraph57a_tage_bis_faelligkeit: number | null;
  naechste_wartung_am:         Date | null;
  wartung_tage_bis_faelligkeit: number | null;
  naechste_pruefung_tage:      number | null;
  aktiver_lehrgang?:           AktiverLehrgang | null;
}

// ── Detail View ───────────────────────────────────────────────────────────────

export interface FahrzeugDetail extends Fahrzeug {
  paragraph57a_tage_bis_faelligkeit: number | null;
  wartung_tage_bis_faelligkeit:      number | null;
  naechste_pruefung_tage:            number | null;
  wartungslog: FahrzeugWartungslog[];
}

// ── Dashboard KPI ─────────────────────────────────────────────────────────────

export interface VehicleStats {
  total:              number;
  einsatzbereit:      number;
  ausserDienst:       number;
  inLehrgang:         number; // derived from active lehrgang bookings
  inspectionsDue:     number;
  inspectionsOverdue: number;
}

export interface OverlappingBooking {
  id:              string;
  titel:           string;
  beginn:          Date;
  ende:            Date;
  gebucht_von_name: string;
}

// ── Inspection Alert ──────────────────────────────────────────────────────────

export type InspectionAlertType = '57a' | 'wartung';

export interface InspectionAlert {
  fahrzeugId:    string;
  bezeichnung:   string;
  kurzname:      string | null;
  type:          InspectionAlertType;
  faelligAm:     Date;
  tage:          number;
}

// ── Create / Update DTOs ──────────────────────────────────────────────────────

export interface CreateFahrzeugData {
  bezeichnung:            string;
  kurzname?:              string;
  amtliches_kennzeichen?: string;
  fahrgestellnummer?:     string;
  baujahr?:               number;
  hersteller?:            string;
  typ_schluessel?:        string;
  besatzung_soll?:        string;
  status?:                FahrzeugStatus;
  status_bemerkung?:      string;
  standort?:              string;
  bild_url?:              string;
  paragraph57a_faellig_am?: string;
  naechste_wartung_am?:     string;
}

export interface UpdateFahrzeugData {
  bezeichnung?:            string;
  kurzname?:               string | null;
  amtliches_kennzeichen?:  string | null;
  fahrgestellnummer?:      string | null;
  baujahr?:                number | null;
  hersteller?:             string | null;
  typ_schluessel?:         string | null;
  besatzung_soll?:         string | null;
  status?:                 FahrzeugStatus;
  status_bemerkung?:       string | null;
  standort?:               string;
  bild_url?:               string | null;
  paragraph57a_faellig_am?: string | null;
  naechste_wartung_am?:     string | null;
}

export interface CreateWartungslogData {
  datum:              string;
  art?:               WartungslogArt;
  beschreibung:       string;
  km_stand?:          number;
  kraftstoff_liter?:  number;
  kosten?:            number;
  externe_werkstatt?: string;
  ergebnis?:          WartungslogErgebnis;
  naechste_faelligkeit?: string;
}

export interface UpdateWartungslogData {
  datum:              string;
  art?:               WartungslogArt;
  beschreibung:       string;
  km_stand?:          number;
  externe_werkstatt?: string;
  ergebnis?:          WartungslogErgebnis;
  naechste_faelligkeit?: string;
}
