// Lookup types
export type KontoArt = 'einnahme' | 'ausgabe' | 'vermoegen' | 'verbindlichkeit';
export type TransaktionTyp = 'einnahme' | 'ausgabe' | 'transfer';
export type TransaktionStatus = 'entwurf' | 'gebucht' | 'storniert';
export type FreigabeStatus = 'ausstehend' | 'genehmigt' | 'abgelehnt';
export type WiederkehrendIntervall = 'monatlich' | 'quartalsweise' | 'halbjaehrlich' | 'jaehrlich';
export type PlanungStatus = 'entwurf' | 'aktiv' | 'abgeschlossen';
export type AusgabenTyp = 'gwg' | 'anlagen' | 'instandhaltung';
export type BudgetTyp = 'detailliert' | 'einfach';

export const AUSGABEN_TYP_LABELS: Record<AusgabenTyp, string> = {
  gwg: 'GWG',
  anlagen: 'Anlagen',
  instandhaltung: 'Instandhaltung',
};

// Label maps
export const TRANSAKTION_STATUS_LABELS: Record<TransaktionStatus, string> = {
  entwurf: 'Entwurf',
  gebucht: 'Gebucht',
  storniert: 'Storniert',
};

export const TRANSAKTION_STATUS_COLORS: Record<TransaktionStatus, 'default' | 'warning' | 'success' | 'error'> = {
  entwurf: 'default',
  gebucht: 'warning',
  storniert: 'error',
};

export const TRANSAKTION_TYP_LABELS: Record<TransaktionTyp, string> = {
  einnahme: 'Einnahme',
  ausgabe: 'Ausgabe',
  transfer: 'Transfer',
};

export const KONTO_ART_LABELS: Record<KontoArt, string> = {
  einnahme: 'Einnahmen',
  ausgabe: 'Ausgaben',
  vermoegen: 'Vermögen',
  verbindlichkeit: 'Verbindlichkeiten',
};

export const INTERVALL_LABELS: Record<WiederkehrendIntervall, string> = {
  monatlich: 'Monatlich',
  quartalsweise: 'Quartalsweise',
  halbjaehrlich: 'Halbjährlich',
  jaehrlich: 'Jährlich',
};

// Entities
export interface Kategorie {
  id: number;
  haushaltsjahr_id: number;
  bezeichnung: string;
  sortierung: number;
}

export interface KontoTyp {
  id: number;
  bezeichnung: string;
  art: KontoArt;
  sort_order: number;
}

export interface Bankkonto {
  id: number;
  bezeichnung: string;
  iban: string | null;
  bic: string | null;
  institut: string | null;
  ist_standard: boolean;
  aktiv: boolean;
  erstellt_von: string | null;
  erstellt_am: string;
  aktualisiert_am: string;
}

export interface Haushaltsjahr {
  id: number;
  jahr: number;
  bezeichnung: string;
  beginn: string;
  ende: string;
  abgeschlossen: boolean;
  erstellt_von: string | null;
  erstellt_am: string;
  aktualisiert_am: string;
}

export interface Konto {
  id: number;
  haushaltsjahr_id: number;
  konto_typ_id: number | null;
  kontonummer: number;
  bezeichnung: string;
  parent_id: number | null;
  kategorie_id: number | null;
  budget_gwg: number;
  budget_anlagen: number;
  budget_instandhaltung: number;
  budget_typ: BudgetTyp;
  budget_gesamt: number;
  notizen: string | null;
  aktiv: boolean;
  erstellt_von: string | null;
  erstellt_am: string;
  aktualisiert_am: string;
  // Joined fields
  konto_typ_bezeichnung?: string;
  konto_typ_art?: KontoArt;
  parent_bezeichnung?: string;
}

export interface KontoTreeNode extends Konto {
  spent_gwg: number;
  spent_anlagen: number;
  spent_instandhaltung: number;
  einnahmen_betrag: number;
  kategorie_bezeichnung?: string;
  children: KontoTreeNode[];
}

export interface KontoBudgetInfo extends Konto {
  gebucht_betrag: number;
  ausstehend_betrag: number;
  verfuegbar_betrag: number;
  auslastung_prozent: number;
}

export interface Transaktion {
  id: number;
  haushaltsjahr_id: number;
  konto_id: number | null;
  bankkonto_id: number | null;
  laufende_nummer: number | null;
  haushaltsjahr_jahr?: number;
  typ: TransaktionTyp;
  betrag: number;
  datum: string;
  buchungsdatum: string | null;
  beschreibung: string | null;
  empfaenger_auftraggeber: string | null;
  verwendungszweck: string | null;
  beleg_nr: string | null;
  status: TransaktionStatus;
  bestellung_id: number | null;
  ausgaben_typ: AusgabenTyp | null;
  wiederkehrend_id: number | null;
  erstellt_von: string | null;
  gebucht_von: string | null;
  erstellt_am: string;
  aktualisiert_am: string;
  // Joined fields
  konto_bezeichnung?: string;
  konto_kontonummer?: number;
  bankkonto_bezeichnung?: string;
  transfer_ziel_bankkonto_id?: number;
  transfer_ziel_bezeichnung?: string;
  belege?: Beleg[];
}

export interface Beleg {
  id: number;
  transaktion_id: number;
  dateiname: string;
  original_name: string;
  dateityp: string;
  dateigroesse: number;
  erstellt_von: string | null;
  erstellt_am: string;
}

export interface Freigabe {
  id: number;
  transaktion_id: number;
  status: FreigabeStatus;
  kommentar: string | null;
  freigegeben_von: string | null;
  freigegeben_am: string | null;
  erstellt_am: string;
}

export interface WiederkehrendBuchung {
  id: number;
  bezeichnung: string;
  konto_id: number | null;
  bankkonto_id: number | null;
  typ: TransaktionTyp;
  betrag: number;
  beschreibung: string | null;
  empfaenger_auftraggeber: string | null;
  intervall: WiederkehrendIntervall;
  naechste_ausfuehrung: string;
  ausfuehrungstag: 'erster' | 'mitte' | 'letzter';
  ausfuehrungs_monat: number | null;
  aktiv: boolean;
  erstellt_von: string | null;
  erstellt_am: string;
  aktualisiert_am: string;
}

export interface BuchhaltungAudit {
  id: number;
  transaktion_id: number | null;
  aktion: string;
  details: Record<string, unknown> | null;
  erstellt_von: string | null;
  erstellt_am: string;
}

export interface BuchhaltungStats {
  haushaltsjahr_id: number;
  total_einnahmen: number;
  total_ausgaben: number;
  saldo: number;
  konten_budget: KontoBudgetInfo[];
}

// Form data types
export interface HaushaltsjahrFormData {
  jahr: number;
  bezeichnung: string;
  beginn: string;
  ende: string;
}

export interface BankkontoFormData {
  bezeichnung: string;
  iban?: string;
  bic?: string;
  institut?: string;
  ist_standard?: boolean;
}

export interface KontoFormData {
  haushaltsjahr_id: number;
  konto_typ_id?: number;
  kontonummer: number;
  bezeichnung: string;
  budget_gwg: number;
  budget_anlagen: number;
  budget_instandhaltung: number;
  budget_typ?: BudgetTyp;
  budget_gesamt?: number;
  parent_id?: number | null;
  kategorie_id?: number | null;
  notizen?: string;
}

export interface TransaktionFormData {
  haushaltsjahr_id: number;
  konto_id?: number | null;
  bankkonto_id?: number | null;
  typ: TransaktionTyp;
  betrag: number;
  datum: string;
  beschreibung?: string;
  empfaenger_auftraggeber?: string;
  verwendungszweck?: string;
  beleg_nr?: string;
  bestellung_id?: number | null;
  ausgaben_typ?: AusgabenTyp | null;
}

// Filter type for transaction list
export interface TransaktionFilters {
  haushaltsjahr_id?: number;
  konto_id?: number;
  status?: TransaktionStatus;
  typ?: TransaktionTyp;
  datum_von?: string;
  datum_bis?: string;
  search?: string;
}

export interface WiederkehrendFormData {
  bezeichnung: string;
  konto_id?: number | null;
  bankkonto_id?: number | null;
  typ: TransaktionTyp;
  betrag: number;
  beschreibung?: string;
  empfaenger_auftraggeber?: string;
  intervall: WiederkehrendIntervall;
  naechste_ausfuehrung: string;
  ausfuehrungstag?: 'erster' | 'mitte' | 'letzter';
  ausfuehrungs_monat?: number;
  aktiv?: boolean;
}

export interface KontoDetailResponse {
  konto: Konto;
  children: KontoTreeNode[];
  transaktionen: Transaktion[];
}

export interface ErstattungFormData {
  konto_id: number;
  bankkonto_id: number | null;
  betrag: number;
  datum: string;
  beschreibung?: string;
  empfaenger_auftraggeber?: string;
  quell_transaktion_ids: number[];
}

export interface ErstattungLinks {
  erstattung_transaktion_id: number | null;
  quell_transaktion_ids: number[];
}

export interface TransferFormData {
  haushaltsjahr_id: number;
  bankkonto_id: number;
  transfer_ziel_bankkonto_id: number;
  betrag: number;
  datum: string;
  beschreibung?: string;
  beleg_nr?: string;
}

export interface BuchhaltungEinstellungen {
  default_alert_threshold?: string;
  [key: string]: unknown;
}

export interface Planung {
  id: number;
  bezeichnung: string;
  haushaltsjahr_id: number | null;
  haushaltsjahr_bezeichnung?: string;
  haushaltsjahr_jahr?: number;
  beschreibung?: string;
  status: PlanungStatus;
  positionen_count: number;
  total_gwg: number;
  total_anlagen: number;
  total_instandhaltung: number;
  erstellt_von: string | null;
  erstellt_am: string;
}

export interface Planposition {
  id: number;
  planung_id: number;
  konto_id: number | null;
  konto_bezeichnung?: string;
  konto_kontonummer?: number;
  bezeichnung: string;
  budget_gwg: number;
  budget_anlagen: number;
  budget_instandhaltung: number;
  notizen: string | null;
  sort_order: number;
}

export interface PlanungDetail extends Planung {
  positionen: Planposition[];
}

export interface BankkontoStatementRow {
  id: number;
  datum: string;
  typ: TransaktionTyp;
  beschreibung: string | null;
  beleg_nr: string | null;
  betrag: number;
  laufender_saldo: number;
  transfer_ziel_bezeichnung?: string;
}

export interface BankkontoStatement {
  bankkonto: Bankkonto;
  einnahmen: number;
  ausgaben: number;
  saldo: number;
  rows: BankkontoStatementRow[];
}
