/**
 * Zeitangaben der Prüfungssimulation – reine Funktionen ohne React.
 *
 * Alle Ausgaben sind ausgeschriebene deutsche Sätze und keine Ziffernblöcke
 * wie „01:58:12“: Eine Restzeit muss vorlesbar sein, nicht nur ablesbar.
 */

/** Ab dieser Restzeit wird einmalig gewarnt (fünf Minuten). */
export const ZEITWARNUNG_MS = 5 * 60 * 1000;

function einheit(anzahl: number, eins: string, mehrere: string): string {
  return `${String(anzahl)} ${anzahl === 1 ? eins : mehrere}`;
}

/**
 * Restzeit als ruhiger Satzbaustein.
 *
 * Oberhalb einer Minute wird auf volle Minuten aufgerundet: Ein sekündlich
 * springender Zähler erzeugt Druck, ohne Nutzen zu stiften.
 */
export function restzeitText(millisekunden: number): string {
  const sekunden = Math.max(0, Math.ceil(millisekunden / 1000));
  if (sekunden < 60) {
    return einheit(sekunden, 'Sekunde', 'Sekunden');
  }

  const minuten = Math.ceil(sekunden / 60);
  if (minuten < 60) {
    return einheit(minuten, 'Minute', 'Minuten');
  }

  const stunden = Math.floor(minuten / 60);
  const restMinuten = minuten % 60;
  const stundenText = einheit(stunden, 'Stunde', 'Stunden');
  return restMinuten === 0
    ? stundenText
    : `${stundenText} ${einheit(restMinuten, 'Minute', 'Minuten')}`;
}

/** Tatsächlich benötigte Bearbeitungsdauer für die Auswertung. */
export function dauerText(millisekunden: number): string {
  const sekunden = Math.max(0, Math.round(millisekunden / 1000));
  const minuten = Math.floor(sekunden / 60);
  const restSekunden = sekunden % 60;
  return minuten === 0
    ? einheit(restSekunden, 'Sekunde', 'Sekunden')
    : `${einheit(minuten, 'Minute', 'Minuten')} ${einheit(restSekunden, 'Sekunde', 'Sekunden')}`;
}

/** ISO-Datum („2024-12-16“) als deutsches Datum. */
export function datumText(iso: string): string {
  const [jahr, monat, tag] = iso.split('-');
  return jahr !== undefined && monat !== undefined && tag !== undefined
    ? `${tag}.${monat}.${jahr}`
    : iso;
}

/*
  Der Formatierer wird einmalig angelegt: `Intl` ist Teil der Laufzeit, es
  wird nichts nachgeladen und keine Verbindung aufgebaut.
*/
const ZEITPUNKT_FORMAT = new Intl.DateTimeFormat('de-DE', {
  dateStyle: 'medium',
  timeStyle: 'short',
});

/** ISO-Zeitstempel eines früheren Laufs in Ortszeit. */
export function zeitpunktText(iso: string): string {
  const zeitpunkt = new Date(iso);
  return Number.isNaN(zeitpunkt.getTime()) ? iso : ZEITPUNKT_FORMAT.format(zeitpunkt);
}
