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

/**
 * Eindeutiger Bezeichner für jeden definierten Prüfpunkt des technischen Gesamttests.
 * <p>
 * Jeder Wert entspricht genau einem Prüfpunkt, der im Rahmen der Aktion
 * „Technische Tests ausführen" durchlaufen wird. Die Reihenfolge der Konstanten
 * ist nicht verbindlich für die Ausführungsreihenfolge; sie dient nur der
 * Übersichtlichkeit.
 * <p>
 * Prüfpunkte sind unabhängig voneinander; ein Fehler in einem Prüfpunkt darf
 * nicht dazu führen, dass spätere Prüfpunkte übersprungen werden. Wenn ein
 * Prüfpunkt wegen fehlender Voraussetzungen nicht ausführbar ist (z. B.
 * API-Key-Test ohne bekannte Base-URL), ist das Ergebnis
 * {@link CheckpointResult.NotApplicable}, kein Fehler.
 */
public enum CheckpointId {

    /**
     * Grundlegende Konfigurationsvalidierung – entspricht der lokalen Editorvalidierung.
     * Prüft formale Pflichtfelder und Werteformate ohne Dateisystem- oder Netzwerkkontakt.
     */
    CONFIGURATION_BASIC_VALIDATION,

    /**
     * Provider-Konfiguration prüfen: aktiver Provider bekannt, alle Pflichtfelder
     * des aktiven Providers formal ausgefüllt.
     */
    PROVIDER_CONFIGURATION,

    /**
     * Base-URL bzw. Endpunkt des aktiven Providers technisch erreichbar (Netzwerktest).
     */
    BASE_URL_REACHABLE,

    /**
     * API-Key vorhanden – mindestens eine Quelle (Umgebungsvariable oder Properties-Datei)
     * liefert einen nicht leeren Wert. Dieser Prüfpunkt trifft keine Aussage über die
     * Korrektheit des Schlüssels.
     */
    API_KEY_PRESENT,

    /**
     * API-Key technisch akzeptiert – Authentifizierung am Provider-Endpunkt erfolgreich.
     * Setzt voraus, dass {@link #API_KEY_PRESENT} bestanden wurde; andernfalls ist dieser
     * Prüfpunkt {@link CheckpointResult.NotApplicable}.
     */
    API_KEY_ACCEPTED,

    /**
     * Modellliste abrufbar – der Provider liefert eine nicht leere Liste verfügbarer Modelle.
     * Nutzt denselben Outbound-Port wie der automatische Modellabruf; keine zweite Implementierung.
     */
    MODEL_LIST_AVAILABLE,

    /**
     * Ausgewähltes Modell plausibel – der konfigurierte Modellname ist in der zuletzt
     * geladenen Modellliste vorhanden oder formal zulässig.
     * Setzt voraus, dass {@link #MODEL_LIST_AVAILABLE} bestanden wurde.
     */
    SELECTED_MODEL_PLAUSIBLE,

    /**
     * Prompt-Datei vorhanden und lesbar – die konfigurierte Prompt-Datei existiert im
     * Dateisystem und kann gelesen werden.
     */
    PROMPT_FILE_PRESENT,

    /**
     * Quellordner vorhanden und lesbar – der konfigurierte Quellordner existiert und
     * kann vom Prozess gelesen werden.
     */
    SOURCE_FOLDER_PRESENT,

    /**
     * Zielordner vorhanden oder anlegbar sowie schreibbar – der konfigurierte Zielordner
     * existiert und ist schreibbar, oder er ist noch nicht vorhanden, aber der Pfad ist
     * technisch anlegbar.
     */
    TARGET_FOLDER_USABLE,

    /**
     * SQLite-Datei bzw. SQLite-Pfad technisch nutzbar – der konfigurierte SQLite-Pfad
     * zeigt auf eine vorhandene Datei oder auf einen beschreibbaren Ordner, in dem die
     * Datei neu angelegt werden kann.
     */
    SQLITE_PATH_USABLE,

    /**
     * Log-Verzeichnis beschreibbar – das konfigurierte (oder Standard-)Log-Verzeichnis
     * ist vorhanden und schreibbar. Zeigt zusätzlich den tatsächlichen Log-Dateipfad
     * aus der aktiven Log4j2-Konfiguration an. Ein nicht beschreibbares Log-Verzeichnis
     * ist eine Warnung, kein harter Fehler.
     */
    LOG_DIRECTORY_USABLE
}
