// =============================================================================
// Vehicle Fleet Management — Frontend Type Definitions
// =============================================================================

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';

// ── API Response Shapes ───────────────────────────────────────────────────────

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

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:           string | null;
  ausser_dienst_bis:           string | null;
  bild_url:                    string | null;
  paragraph57a_faellig_am:           string | null;
  paragraph57a_tage_bis_faelligkeit: number | null;
  naechste_wartung_am:               string | null;
  wartung_tage_bis_faelligkeit:      number | null;
  naechste_pruefung_tage:            number | null;
  aktiver_lehrgang:            AktiverLehrgang | null;
}

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

export const WartungslogErgebnisLabel: Record<WartungslogErgebnis, string> = {
  bestanden:               'Bestanden',
  bestanden_mit_maengeln:  'Bestanden mit Mängeln',
  nicht_bestanden:         'Nicht bestanden',
};

export const WartungslogErgebnisColor: Record<WartungslogErgebnis, 'success' | 'warning' | 'error'> = {
  bestanden:               'success',
  bestanden_mit_maengeln:  'warning',
  nicht_bestanden:         'error',
};

export interface FahrzeugWartungslog {
  id:               string;
  fahrzeug_id:      string;
  datum:            string;
  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: string | null;
  dokument_url:     string | null;
  erfasst_von:      string | null;
  created_at:       string;
}

export interface FahrzeugDetail {
  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:     string | null;
  ausser_dienst_bis:     string | null;
  standort:              string;
  bild_url:              string | null;
  created_at:            string;
  updated_at:            string;
  paragraph57a_faellig_am:           string | null;
  paragraph57a_tage_bis_faelligkeit: number | null;
  naechste_wartung_am:               string | null;
  wartung_tage_bis_faelligkeit:      number | null;
  naechste_pruefung_tage:            number | null;
  aktiver_lehrgang:      AktiverLehrgang | null;
  wartungslog: FahrzeugWartungslog[];
}

export interface VehicleStats {
  total:              number;
  einsatzbereit:      number;
  ausserDienst:       number;
  inLehrgang:         number;
  inspectionsDue:     number;
  inspectionsOverdue: number;
}

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

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

// ── Request Payload Types ─────────────────────────────────────────────────────

export interface CreateFahrzeugPayload {
  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 type UpdateFahrzeugPayload = {
  [K in keyof CreateFahrzeugPayload]?: CreateFahrzeugPayload[K] | null;
};

export interface UpdateStatusPayload {
  status:               FahrzeugStatus;
  bemerkung?:           string;
  ausserDienstVon?:     string;  // ISO datetime, required when status is ausser_dienst_*
  ausserDienstBis?:     string;  // ISO datetime, required when status is ausser_dienst_*
}

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

export interface StatusUpdateResponse {
  overlappingBookings: OverlappingBooking[];
}

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

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