// ---------------------------------------------------------------------------
// Frontend training types — mirrors backend/src/models/training.model.ts
// ---------------------------------------------------------------------------

export const UEBUNG_TYPEN = [
  'Übungsabend',
  'Lehrgang',
  'Sonderdienst',
  'Versammlung',
  'Gemeinschaftsübung',
  'Sonstiges',
] as const;

export type UebungTyp = (typeof UEBUNG_TYPEN)[number];

export const TEILNAHME_STATUSES = [
  'zugesagt',
  'abgesagt',
  'erschienen',
  'entschuldigt',
  'unbekannt',
] as const;

export type TeilnahmeStatus = (typeof TEILNAHME_STATUSES)[number];

export interface Uebung {
  id: string;
  titel: string;
  beschreibung?: string | null;
  typ: UebungTyp;
  datum_von: string; // ISO string from JSON
  datum_bis: string;
  ort?: string | null;
  treffpunkt?: string | null;
  pflichtveranstaltung: boolean;
  mindest_teilnehmer?: number | null;
  max_teilnehmer?: number | null;
  angelegt_von?: string | null;
  erstellt_am: string;
  aktualisiert_am: string;
  abgesagt: boolean;
  absage_grund?: string | null;
}

export interface Teilnahme {
  uebung_id: string;
  user_id: string;
  status: TeilnahmeStatus;
  antwort_am?: string | null;
  erschienen_erfasst_am?: string | null;
  erschienen_erfasst_von?: string | null;
  bemerkung?: string | null;
  user_name?: string | null;
  user_email?: string | null;
}

export interface AttendanceCounts {
  gesamt_eingeladen: number;
  anzahl_zugesagt: number;
  anzahl_abgesagt: number;
  anzahl_erschienen: number;
  anzahl_entschuldigt: number;
  anzahl_unbekannt: number;
}

export interface UebungWithAttendance extends Uebung, AttendanceCounts {
  teilnahmen?: Teilnahme[];
  eigener_status?: TeilnahmeStatus;
  angelegt_von_name?: string | null;
}

export interface UebungListItem {
  id: string;
  titel: string;
  typ: UebungTyp;
  datum_von: string;
  datum_bis: string;
  ort?: string | null;
  pflichtveranstaltung: boolean;
  abgesagt: boolean;
  anzahl_zugesagt: number;
  anzahl_erschienen: number;
  gesamt_eingeladen: number;
  eigener_status?: TeilnahmeStatus;
}

export interface MemberParticipationStats {
  userId: string;
  name: string;
  totalUebungen: number;
  attended: number;
  attendancePercent: number;
  pflichtGesamt: number;
  pflichtErschienen: number;
  uebungsabendQuotePct: number;
}

// ---------------------------------------------------------------------------
// Form data types (sent to API)
// ---------------------------------------------------------------------------

export interface CreateUebungData {
  titel: string;
  beschreibung?: string | null;
  typ: UebungTyp;
  datum_von: string; // ISO-8601 with offset
  datum_bis: string;
  ort?: string | null;
  treffpunkt?: string | null;
  pflichtveranstaltung: boolean;
  mindest_teilnehmer?: number | null;
  max_teilnehmer?: number | null;
}

export type UpdateUebungData = Partial<CreateUebungData>;
