import { deriveObligations } from './obligations';
import type { AISystem, ContentPack, Obligation, ObligationStatus } from './types';

/** Ein Eintrag der systemübergreifenden Aufgabenliste. */
export interface ChecklistEntry {
  readonly systemId: string;
  readonly systemName: string;
  readonly obligation: Obligation;
  readonly status: ObligationStatus;
  /** Erledigt oder als nicht anwendbar markiert. */
  readonly resolved: boolean;
  /** Frist liegt am oder vor dem Stichtag. */
  readonly due: boolean;
}

/** Gruppierte Aufgabenliste mit Fortschritt. */
export interface Checklist {
  /** Fällig (Frist erreicht/überschritten) und noch nicht erledigt. */
  readonly dueNow: readonly ChecklistEntry[];
  /** Kommt auf das Unternehmen zu (Frist in der Zukunft), noch offen. */
  readonly upcoming: readonly ChecklistEntry[];
  /** Erledigt oder nicht anwendbar. */
  readonly resolved: readonly ChecklistEntry[];
  readonly total: number;
  readonly resolvedCount: number;
}

/**
 * Baut die systemübergreifende, abhakbare Aufgabenliste.
 *
 * Jede Pflicht jedes Systems wird zu einem Eintrag; Sortierung innerhalb
 * der Gruppen nach Frist aufsteigend, dann Systemname.
 *
 * @param systems - Alle registrierten KI-Systeme
 * @param pack - Regulatorischer Content-Pack (Sprache des Aufrufers)
 * @param countries - Aktivierte Länder-Module
 * @param today - Stichtag im ISO-Format (YYYY-MM-DD)
 */
export function buildChecklist(
  systems: readonly AISystem[],
  pack: ContentPack,
  countries: readonly string[],
  today: string,
): Checklist {
  const entries: ChecklistEntry[] = systems.flatMap((system) =>
    deriveObligations(system.classification, system.answers, pack, countries).map(
      (obligation) => {
        const status = system.obligationStatus[obligation.id] ?? 'open';
        const resolved = status === 'done' || status === 'not-applicable';
        return {
          systemId: system.id,
          systemName: system.name,
          obligation,
          status,
          resolved,
          due: obligation.deadline <= today,
        };
      },
    ),
  );

  const byDeadline = (a: ChecklistEntry, b: ChecklistEntry): number =>
    a.obligation.deadline.localeCompare(b.obligation.deadline) ||
    a.systemName.localeCompare(b.systemName);

  const dueNow = entries.filter((e) => !e.resolved && e.due).sort(byDeadline);
  const upcoming = entries.filter((e) => !e.resolved && !e.due).sort(byDeadline);
  const resolved = entries.filter((e) => e.resolved).sort(byDeadline);

  return {
    dueNow,
    upcoming,
    resolved,
    total: entries.length,
    resolvedCount: resolved.length,
  };
}
