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

import java.util.Objects;

import de.gecheckt.pdf.umbenenner.application.validation.editor.EditorValidationInput;

/**
 * Eingabedaten für einen vollständigen technischen Gesamttest der GUI-Konfiguration.
 * <p>
 * Enthält den aktuellen Editorzustand als {@link EditorValidationInput} (alle String-Werte
 * so wie sie im Editor vorliegen). Der technische Gesamttest arbeitet ausschließlich auf
 * diesen Werten; er liest keine Konfigurationsdatei vom Dateisystem und speichert nichts.
 * <p>
 * Der optionale Pfad zur Konfigurationsdatei ({@code configFilePath}) ermöglicht es dem
 * Gesamttest, bei der automatischen Prompt-Erzeugung den Standardpfad relativ zur
 * Konfigurationsdatei zu bestimmen. Er ist leer, wenn keine Konfigurationsdatei geladen ist.
 * <p>
 * Das {@code logDirectory}-Feld trägt den konfigurierten Rohwert von {@code log.directory}
 * aus dem Editor; leer bedeutet Standardwert {@code ./logs/}.
 * <p>
 * Dieser Record enthält keine JavaFX-Typen und keine Infrastrukturabhängigkeiten.
 *
 * @param validationInput   aktueller Editorzustand; nie {@code null}
 * @param configFilePath    optionaler Pfad der geladenen Konfigurationsdatei als String;
 *                          leer wenn keine Datei geladen ist
 * @param logDirectory      konfigurierter Rohwert von {@code log.directory};
 *                          leer wenn kein Wert konfiguriert ist (Standard {@code ./logs/})
 */
public record TechnicalTestRequest(
        EditorValidationInput validationInput,
        String configFilePath,
        String logDirectory) {

    /**
     * Erstellt eine neue Gesamttest-Anforderung.
     *
     * @param validationInput   aktueller Editorzustand; darf nicht {@code null} sein
     * @param configFilePath    Pfad der Konfigurationsdatei; {@code null} wird zu leerem String
     * @param logDirectory      Rohwert von {@code log.directory}; {@code null} wird zu leerem String
     * @throws NullPointerException wenn {@code validationInput} {@code null} ist
     */
    public TechnicalTestRequest {
        Objects.requireNonNull(validationInput, "validationInput must not be null");
        configFilePath = configFilePath == null ? "" : configFilePath;
        logDirectory = logDirectory == null ? "" : logDirectory;
    }

    /**
     * Erstellt eine Anforderung ohne geladene Konfigurationsdatei und ohne Log-Verzeichnis-Angabe.
     *
     * @param validationInput  aktueller Editorzustand; darf nicht {@code null} sein
     * @return eine neue Anforderung ohne Konfigurationsdateipfad
     */
    public static TechnicalTestRequest of(EditorValidationInput validationInput) {
        return new TechnicalTestRequest(validationInput, "", "");
    }

    /**
     * Gibt an, ob ein Konfigurationsdateipfad gesetzt ist.
     *
     * @return {@code true} wenn ein nicht leerer Pfad vorhanden ist
     */
    public boolean hasConfigFilePath() {
        return !configFilePath.isBlank();
    }
}
