package de.gecheckt.pdf.umbenenner.adapter.in.gui.editor;

import java.util.List;
import java.util.Objects;

import de.gecheckt.pdf.umbenenner.application.validation.technicaltest.CorrectionPlan;
import de.gecheckt.pdf.umbenenner.application.validation.technicaltest.CorrectionSuggestion;

/**
 * Inhalt des gesammelten Bestätigungsdialogs für schreibende Korrekturmaßnahmen.
 * <p>
 * Bevor schreibende Korrekturen aus einem {@link CorrectionPlan} ausgeführt werden,
 * zeigt die GUI diesen Inhalt in einem einmaligen Bestätigungsdialog. Der Benutzer
 * kann die Korrekturen bestätigen oder ablehnen; ohne Bestätigung werden keine
 * Änderungen vorgenommen.
 * <p>
 * Dieser Record liegt bewusst im GUI-Modul, da er ausschließlich für die
 * Darstellung im Bestätigungsdialog der JavaFX-Oberfläche genutzt wird. Er enthält
 * selbst keine JavaFX-Typen und kann auf beliebigen Threads erzeugt werden.
 * <p>
 * Die Beschreibungszeilen ({@link #correctionLines}) entsprechen den
 * {@link CorrectionSuggestion#descriptionForUser()}-Texten der im Plan enthaltenen
 * Vorschläge in Reihenfolge.
 *
 * @param title            deutscher Dialogtitel; nie {@code null}
 * @param introText        einleitender deutschsprachiger Text; nie {@code null}
 * @param correctionLines  Liste der deutschen Beschreibungszeilen, eine pro Korrekturmaßnahme;
 *                         nie {@code null}
 */
public record ConfirmationDialogContent(
        String title,
        String introText,
        List<String> correctionLines) {

    /**
     * Erstellt einen neuen Bestätigungsdialog-Inhalt.
     *
     * @param title            Dialogtitel; darf nicht {@code null} sein
     * @param introText        einleitender Text; darf nicht {@code null} sein
     * @param correctionLines  Beschreibungszeilen; darf nicht {@code null} sein
     * @throws NullPointerException wenn ein Parameter {@code null} ist
     */
    public ConfirmationDialogContent {
        Objects.requireNonNull(title, "title must not be null");
        Objects.requireNonNull(introText, "introText must not be null");
        Objects.requireNonNull(correctionLines, "correctionLines must not be null");
        correctionLines = List.copyOf(correctionLines);
    }

    /**
     * Erstellt den Bestätigungsdialog-Inhalt aus einem {@link CorrectionPlan}.
     * <p>
     * Die Beschreibungszeilen werden aus den
     * {@link CorrectionSuggestion#descriptionForUser()}-Texten der Vorschläge im Plan
     * in Reihenfolge übernommen.
     *
     * @param plan  Korrekturplan; darf nicht {@code null} sein
     * @return ein neuer Dialoginhalt; nie {@code null}
     * @throws NullPointerException wenn {@code plan} {@code null} ist
     */
    public static ConfirmationDialogContent fromPlan(CorrectionPlan plan) {
        Objects.requireNonNull(plan, "plan must not be null");
        List<String> lines = plan.suggestions().stream()
                .map(CorrectionSuggestion::descriptionForUser)
                .toList();
        return new ConfirmationDialogContent(
                "Korrekturen bestätigen",
                "Folgende technische Korrekturen werden durchgeführt:",
                lines);
    }

    /**
     * Gibt an, ob der Dialoginhalt mindestens eine Beschreibungszeile enthält.
     *
     * @return {@code true} wenn mindestens eine Korrekturmaßnahme beschrieben ist
     */
    public boolean hasCorrections() {
        return !correctionLines.isEmpty();
    }
}
