/**
 * Dringlichkeits-Ampel — bewusst LOKAL berechnet, nicht von der KI:
 * deterministisch, kostenlos, und immer aktuell relativ zu "heute"
 * (ein archivierter Brief wird automatisch roter, je näher die Frist rückt).
 *
 * 🔴 Rot  = Frist/Termin in < 7 Tagen (oder bereits abgelaufen)
 * 🟡 Gelb = Frist/Termin in 7-21 Tagen
 * 🟢 Grün = keine Frist / rein informativ
 */
import { BriefAnalyse, Dringlichkeit } from '../types';
import { farben } from '../theme';

export interface AmpelStatus {
  stufe: Dringlichkeit;
  /** Kurztext für die UI, z. B. "Frist in 3 Tagen". */
  text: string;
  farbe: string;
  hintergrund: string;
}

/** Ganze Tage von heute bis zum ISO-Datum (negativ = vergangen). */
export function tageBis(datumIso: string): number {
  const heute = new Date();
  heute.setHours(0, 0, 0, 0);
  const ziel = new Date(`${datumIso}T00:00:00`);
  return Math.round((ziel.getTime() - heute.getTime()) / 86400000);
}

/** Die dringendste anstehende Frist/Termin eines Briefs (oder null). */
export interface NaechsteFrist {
  /** Ganze Tage bis zum Datum (negativ = vergangen). */
  tage: number;
  /** ISO-Datum JJJJ-MM-TT. */
  datumIso: string;
  /** "Frist" oder "Termin". */
  label: string;
  /** Was bis dahin zu tun ist (bei Fristen), sonst null. */
  aktion: string | null;
}

/**
 * Liefert das nächste anstehende Datum (Frist ODER Termin) — für die
 * Fristen-Übersicht (Countdown, Sortierung). null = kein Datum im Brief.
 */
export function naechsteFrist(analyse: BriefAnalyse): NaechsteFrist | null {
  const kandidaten: NaechsteFrist[] = [];
  if (analyse.frist) {
    kandidaten.push({
      tage: tageBis(analyse.frist.datum),
      datumIso: analyse.frist.datum,
      label: 'Frist',
      aktion: analyse.frist.aktion,
    });
  }
  if (analyse.termin) {
    kandidaten.push({
      tage: tageBis(analyse.termin.datum),
      datumIso: analyse.termin.datum,
      label: 'Termin',
      aktion: null,
    });
  }
  if (kandidaten.length === 0) return null;
  return kandidaten.reduce((a, b) => (a.tage <= b.tage ? a : b));
}

/** Datum lesbar formatieren: "27. Juli 2026". */
export function formatiereLangDatum(datumIso: string): string {
  const d = new Date(`${datumIso}T00:00:00`);
  if (isNaN(d.getTime())) return datumIso;
  const monate = [
    'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
    'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember',
  ];
  return `${d.getDate()}. ${monate[d.getMonth()]} ${d.getFullYear()}`;
}

export function berechneAmpel(analyse: BriefAnalyse): AmpelStatus {
  const daten: { tage: number; label: string }[] = [];
  if (analyse.frist) {
    daten.push({ tage: tageBis(analyse.frist.datum), label: 'Frist' });
  }
  if (analyse.termin) {
    daten.push({ tage: tageBis(analyse.termin.datum), label: 'Termin' });
  }

  if (daten.length === 0) {
    return {
      stufe: 'gruen',
      text: 'Keine Frist — nur zur Information',
      farbe: farben.ampelGruen,
      hintergrund: farben.ampelGruenHintergrund,
    };
  }

  // Das dringendste (kleinste) Datum bestimmt die Ampel
  const dringendstes = daten.reduce((a, b) => (a.tage <= b.tage ? a : b));
  const { tage, label } = dringendstes;

  if (tage < 0) {
    return {
      stufe: 'rot',
      text: `${label} abgelaufen (vor ${Math.abs(tage)} Tag${Math.abs(tage) === 1 ? '' : 'en'})! Schnell handeln.`,
      farbe: farben.ampelRot,
      hintergrund: farben.ampelRotHintergrund,
    };
  }
  if (tage === 0) {
    return {
      stufe: 'rot',
      text: `${label} ist HEUTE!`,
      farbe: farben.ampelRot,
      hintergrund: farben.ampelRotHintergrund,
    };
  }
  if (tage < 7) {
    return {
      stufe: 'rot',
      text: `${label} in ${tage} Tag${tage === 1 ? '' : 'en'} — dringend!`,
      farbe: farben.ampelRot,
      hintergrund: farben.ampelRotHintergrund,
    };
  }
  if (tage <= 21) {
    return {
      stufe: 'gelb',
      text: `${label} in ${tage} Tagen — bald erledigen`,
      farbe: farben.ampelGelb,
      hintergrund: farben.ampelGelbHintergrund,
    };
  }
  return {
    stufe: 'gruen',
    text: `${label} in ${tage} Tagen — genug Zeit`,
    farbe: farben.ampelGruen,
    hintergrund: farben.ampelGruenHintergrund,
  };
}
