// ----------------------------------------------------------------
// Frontend mirror of backend/src/models/member.model.ts
// Keep in sync when the model changes.
// ----------------------------------------------------------------

export const DIENSTGRAD_VALUES = [
  'Jugendfeuerwehrmann',
  'Probefeuerwehrmann',
  'Feuerwehrmann',
  'Oberfeuerwehrmann',
  'Hauptfeuerwehrmann',
  'Löschmeister',
  'Oberlöschmeister',
  'Hauptlöschmeister',
  'Brandmeister',
  'Oberbrandmeister',
  'Hauptbrandmeister',
  'Brandinspektor',
  'Oberbrandinspektor',
  'Verwaltungsmeister',
  'Oberverwaltungsmeister',
  'Hauptverwaltungsmeister',
  'Verwalter',
  'Sachbearbeiter',
  'Abschnittssachbearbeiter',
] as const;

export const STATUS_VALUES = [
  'aktiv',
  'kind',
  'jugend',
  'reserve',
] as const;

export const FUNKTION_VALUES = [
  'Kommandant',
  'Stellv. Kommandant',
  'Gruppenführer',
  'Truppführer',
  'Gerätewart',
  'Kassier',
  'Schriftführer',
  'Atemschutzwart',
  'Ausbildungsbeauftragter',
] as const;

export const TSHIRT_GROESSE_VALUES = [
  'XS', 'S', 'M', 'L', 'XL', 'XXL', 'XXXL',
] as const;

export type DienstgradEnum = typeof DIENSTGRAD_VALUES[number];
export type StatusEnum = typeof STATUS_VALUES[number];
export type FunktionEnum = typeof FUNKTION_VALUES[number];
export type TshirtGroesseEnum = typeof TSHIRT_GROESSE_VALUES[number];

export interface MitgliederProfile {
  id: string;
  user_id: string;
  dienstgrad: DienstgradEnum | null;
  dienstgrad_seit: string | null;   // ISO date string from API
  funktion: FunktionEnum[];
  status: StatusEnum;
  eintrittsdatum: string | null;
  austrittsdatum: string | null;
  geburtsdatum: string | null;      // null when redacted by server
  _age?: number;                    // synthesised when geburtsdatum is redacted
  telefon_mobil: string | null;
  telefon_privat: string | null;
  notfallkontakt_name: string | null;
  notfallkontakt_telefon: string | null;
  fuehrerscheinklassen: string[];
  tshirt_groesse: TshirtGroesseEnum | null;
  schuhgroesse: string | null;
  bemerkungen: string | null;
  fdisk_standesbuch_nr: string | null;
  bild_url: string | null;
  // FDISK-synced extended profile fields
  geburtsort: string | null;
  geschlecht: string | null;
  beruf: string | null;
  wohnort: string | null;
  plz: string | null;
  created_at: string;
  updated_at: string;
}

export interface DienstgradVerlaufEntry {
  id: string;
  user_id: string;
  dienstgrad_neu: string;
  dienstgrad_alt: string | null;
  datum: string;
  durch_user_id: string | null;
  durch_user_name?: string | null;
  bemerkung: string | null;
  created_at: string;
}

export interface MemberWithProfile {
  id: string;
  email: string;
  name: string | null;
  given_name: string | null;
  family_name: string | null;
  preferred_username: string | null;
  profile_picture_url: string | null;
  is_active: boolean;
  last_login_at: string | null;
  created_at: string;
  profile: MitgliederProfile | null;
  dienstgrad_verlauf?: DienstgradVerlaufEntry[];
}

export interface MemberListItem {
  id: string;
  name: string | null;
  given_name: string | null;
  family_name: string | null;
  email: string;
  profile_picture_url: string | null;
  is_active: boolean;
  profile_id: string | null;
  fdisk_standesbuch_nr: string | null;
  dienstgrad: DienstgradEnum | null;
  funktion: FunktionEnum[];
  status: StatusEnum | null;
  eintrittsdatum: string | null;
  telefon_mobil: string | null;
}

export interface MemberFilters {
  search?: string;
  status?: StatusEnum[];
  dienstgrad?: DienstgradEnum[];
  page?: number;
  pageSize?: number;
}

export type CreateMemberProfileData = Partial<Omit<MitgliederProfile, 'id' | 'user_id' | 'created_at' | 'updated_at'>>;
export type UpdateMemberProfileData = CreateMemberProfileData;

export interface MemberStats {
  total: number;
  aktiv: number;
  kind: number;
  jugend: number;
  reserve: number;
}

// ----------------------------------------------------------------
// Display helpers
// ----------------------------------------------------------------

/** Returns the display name built from given/family name or email fallback */
export function getMemberDisplayName(
  member: Pick<MemberWithProfile | MemberListItem, 'given_name' | 'family_name' | 'name' | 'email'>
): string {
  if (member.given_name || member.family_name) {
    return [member.given_name, member.family_name].filter(Boolean).join(' ');
  }
  return member.name || member.email;
}

/** Format a German phone number for display.
 *  Stored raw; displayed with spaces for readability.
 *  e.g. "+436641234567" → "+43 664 123 4567"
 *  Falls back to raw value for unrecognised formats. */
export function formatPhone(raw: string | null | undefined): string {
  if (!raw) return '—';
  const digits = raw.replace(/\s/g, '');
  // Austrian mobile: +43 6xx xxx xxxx
  const atMobile = digits.match(/^(\+43)(6\d{2})(\d{3,4})(\d{4})$/);
  if (atMobile) return `${atMobile[1]} ${atMobile[2]} ${atMobile[3]} ${atMobile[4]}`;
  // German mobile: +49 1xx xxx xxxxx
  const deMobile = digits.match(/^(\+49)(1\d{2})(\d{3,4})(\d{4,5})$/);
  if (deMobile) return `${deMobile[1]} ${deMobile[2]} ${deMobile[3]} ${deMobile[4]}`;
  return raw;
}

/** Returns a human-readable status label */
export const STATUS_LABELS: Record<StatusEnum, string> = {
  aktiv: 'Aktiv',
  kind: 'Kind',
  jugend: 'Jugend',
  reserve: 'Reserve',
};

/** MUI Chip color for each status */
export const STATUS_COLORS: Record<StatusEnum, 'success' | 'warning' | 'error' | 'info' | 'default'> = {
  aktiv: 'success',
  kind: 'info',
  jugend: 'info',
  reserve: 'warning',
};

// ----------------------------------------------------------------
// FDISK-synced sub-section types
// ----------------------------------------------------------------

export interface Befoerderung {
  id: string;
  datum: string | null;
  dienstgrad: string;
  created_at: string;
}

export interface Untersuchung {
  id: string;
  datum: string | null;
  anmerkungen: string | null;
  art: string;
  ergebnis: string | null;
  created_at: string;
}

export interface Fahrgenehmigung {
  id: string;
  ausstellungsdatum: string | null;
  gueltig_bis: string | null;
  behoerde: string | null;
  nummer: string | null;
  klasse: string;
  created_at: string;
}

export interface Ausbildung {
  id: string;
  kursname: string;
  kurs_datum: string | null;
  ablaufdatum: string | null;
  ort: string | null;
  bemerkung: string | null;
  status: string;
  created_at: string;
  kursnummer?: string | null;
  kurs_kurzbezeichnung?: string | null;
  erfolgscode?: string | null;
}
