package de.gecheckt.pdf.umbenenner.application.validation.technicaltest;

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

/**
 * Gesammelter Korrekturplan, der alle schreibenden Korrekturmaßnahmen enthält,
 * die nach Benutzerbestätigung ausgeführt werden sollen.
 * <p>
 * Ein Korrekturplan wird aus den {@link CorrectionSuggestion}-Einträgen der
 * gescheiterten Prüfpunkte eines {@link TechnicalTestReport} abgeleitet. Er wird dem
 * Benutzer in einem gesammelten Bestätigungsdialog präsentiert, bevor eine schreibende
 * Maßnahme ausgeführt wird. Ohne ausdrückliche Bestätigung werden keine Korrekturen
 * vorgenommen.
 * <p>
 * Dieser Record ist immutable und enthält keine JavaFX-Typen.
 *
 * @param suggestions  alle Korrekturvorschläge in Ausführungsreihenfolge; nie {@code null}
 */
public record CorrectionPlan(List<CorrectionSuggestion> suggestions) {

    /**
     * Erstellt einen neuen Korrekturplan.
     *
     * @param suggestions  Liste der Korrekturvorschläge; darf nicht {@code null} sein
     * @throws NullPointerException wenn {@code suggestions} {@code null} ist
     */
    public CorrectionPlan {
        Objects.requireNonNull(suggestions, "suggestions must not be null");
        suggestions = List.copyOf(suggestions);
    }

    /**
     * Erstellt einen leeren Korrekturplan ohne Maßnahmen.
     * <p>
     * Ein leerer Plan zeigt an, dass nach einem Gesamttest keine sicheren technischen
     * Korrekturen angeboten werden können.
     *
     * @return ein leerer Korrekturplan; nie {@code null}
     */
    public static CorrectionPlan empty() {
        return new CorrectionPlan(List.of());
    }

    /**
     * Gibt an, ob dieser Plan mindestens einen Korrekturvorschlag enthält.
     *
     * @return {@code true} wenn mindestens ein Vorschlag vorhanden ist
     */
    public boolean hasCorrections() {
        return !suggestions.isEmpty();
    }

    /**
     * Gibt die Anzahl der enthaltenen Korrekturvorschläge zurück.
     *
     * @return Anzahl der Vorschläge; nie negativ
     */
    public int size() {
        return suggestions.size();
    }
}
