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

/**
 * Liefert den deutschen Standardinhalt für neu erzeugte Prompt-Dateien.
 * <p>
 * Diese Klasse stellt einen brauchbaren Ausgangspunkt für die Prompt-Datei bereit,
 * der ohne weitere Anpassung funktioniert. Der Inhalt enthält die Anweisung an die KI,
 * aus einem bereits extrahierten Dokumenttext einen normierten deutschen Dateinamensvorschlag
 * zu erzeugen.
 * <p>
 * <strong>Abgrenzung:</strong> Diese Klasse enthält ausschließlich den Prompt-Text als
 * reine Zeichenkette. Kein Dateisystem-I/O, kein Template-Engine, keine Platzhalter
 * für den Dokumentinhalt (der Dokumenttext wird vom Aufrufer separat angefügt).
 * <p>
 * Der gelieferte Inhalt ist ein sinnvoller, funktionsfähiger Standard und nicht für
 * fachliche Weiterentwicklung oder Versionierung vorgesehen.
 */
public final class DefaultPromptTemplate {

    /**
     * Platzhalter für die konfigurierte maximale Titellänge. Wird vor der Rückgabe durch den
     * konkreten numerischen Wert ersetzt, damit die erzeugte Prompt-Datei inhaltlich zu der
     * konfigurierten maximalen Titellänge passt.
     */
    private static final String MAX_TITLE_LENGTH_PLACEHOLDER = "{MAX_TITLE_LENGTH}";

    private DefaultPromptTemplate() {
        // Utility-Klasse – keine Instanziierung
    }

    /**
     * Gibt den deutschen Standardinhalt für eine neu erzeugte Prompt-Datei zurück.
     * <p>
     * Der zurückgegebene Text enthält:
     * <ul>
     *   <li>Eine Rollenanweisung an die KI (deutsches Dokumentenverwaltungssystem)</li>
     *   <li>Das erwartete JSON-Ausgabeformat mit den Feldern {@code date}, {@code title} und {@code reasoning}</li>
     *   <li>Benennungsregeln für Titel (maximal {@code maxTitleLength} Zeichen, deutsch, keine Sonderzeichen)</li>
     *   <li>Eine explizite Kürzungsanweisung: die KI muss Titel, die das Zeichenlimit überschreiten würden,
     *       eigenständig kürzen (Abkürzungen, kompaktere Formate, Weglassen unwichtiger Details)</li>
     *   <li>Hinweis auf das Datumsformat ({@code YYYY-MM-DD})</li>
     * </ul>
     * <p>
     * Der Text enthält keinen Platzhalter für den Dokumentinhalt. Der Dokumenttext
     * wird vom {@link de.gecheckt.pdf.umbenenner.application.service.AiRequestComposer}
     * separat angehängt. Der Standardinhalt enthält zusätzlich den Platzhalter
     * {@value #MAX_TITLE_LENGTH_PLACEHOLDER}, damit die zur Laufzeit bestimmte Titellänge
     * auch beim erneuten Laden der Datei durch den {@code AiNamingService} korrekt ersetzt
     * werden kann.
     *
     * @param maxTitleLength die konfigurierte maximale Titellänge, die in den erzeugten
     *                       Standardtext eingesetzt wird; muss {@code >= 1} sein
     * @return der deutsche Standard-Prompt-Inhalt; nie {@code null}, nie leer
     * @throws IllegalArgumentException wenn {@code maxTitleLength < 1}
     */
    public static String defaultContent(int maxTitleLength) {
        if (maxTitleLength < 1) {
            throw new IllegalArgumentException(
                    "maxTitleLength must be >= 1, got: " + maxTitleLength);
        }
        String template = """
                Du bist ein Assistent für ein deutsches Dokumentenverwaltungssystem.
                Deine Aufgabe ist es, aus dem Inhalt einer bereits OCR-verarbeiteten PDF-Datei
                einen aussagekräftigen, kurzen und normierten Dateinamensvorschlag zu erstellen.

                Antworte ausschließlich mit einem validen JSON-Objekt im folgenden Schema:
                {
                  "date": "YYYY-MM-DD",
                  "title": "Kurztitel auf Deutsch",
                  "reasoning": "Kurze Begründung auf Deutsch"
                }

                Regeln:
                - Das Feld "title" ist verpflichtend.
                - Das Feld "reasoning" ist verpflichtend.
                - Das Feld "date" ist optional. Wenn kein belastbares Datum aus dem Dokument eindeutig ableitbar ist, lass das Feld weg. Kein Datum erfinden.
                - Das Datumsformat ist YYYY-MM-DD (z.B. 2026-03-15).
                - Der Titel ist auf Deutsch, verständlich und eindeutig für den Dokumentinhalt.
                - Der Titel hat maximal {MAX_TITLE_LENGTH} Zeichen (Basistitel ohne Suffix).
                - Wenn der ideale Titel das Zeichenlimit überschreiten würde, kürze den Titel
                  eigenständig auf maximal {MAX_TITLE_LENGTH} Zeichen, ohne dass der Inhalt
                  unverständlich wird. Erlaubte Mittel: Abkürzungen (z. B. "Nov." statt
                  "November", "Int." statt "Internationale"), kompaktere Datumsformate
                  (z. B. "11-2022" statt "November 2022"), Weglassen unwichtiger Details und
                  Kürzen von Adressen oder Absenderfloskeln.
                - Das Zeichenlimit von {MAX_TITLE_LENGTH} Zeichen ist verbindlich und MUSS
                  eingehalten werden.
                - Keine generischen Bezeichner wie "Dokument", "Scan", "Datei", "PDF".
                - Keine Sonderzeichen außer Leerzeichen im Titel.
                - Eigennamen bleiben unverändert.
                - Umlaute und ß sind erlaubt.
                - Kein Text außerhalb des JSON-Objekts. Keine Markdown-Codeblöcke und keine
                  ```-Zäune, keine Einleitung und keine Nachbemerkung. Gib ausschließlich das
                  reine JSON-Objekt aus, beginnend mit { und endend mit }.
                - Unsicherheiten, Einschränkungen oder Hinweise gehören ausschließlich in das
                  Feld "reasoning", niemals in Text außerhalb des JSON-Objekts.
                """;
        return template.replace(MAX_TITLE_LENGTH_PLACEHOLDER, String.valueOf(maxTitleLength));
    }
}
