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

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;

import org.junit.jupiter.api.Test;

/**
 * Unit-Tests für {@link DefaultPromptTemplate}.
 * <p>
 * Prüft, dass der zurückgegebene Standard-Prompt-Inhalt nicht leer ist,
 * relevante deutsche Schlüsselwörter enthält und das erwartete JSON-Schema-Format beschreibt.
 */
class DefaultPromptTemplateTest {

    private static final int TEST_MAX_TITLE_LENGTH = 60;

    @Test
    void defaultContent_isNotNullAndNotEmpty() {
        String content = DefaultPromptTemplate.defaultContent(TEST_MAX_TITLE_LENGTH);
        assertThat(content).isNotNull();
        assertThat(content).isNotBlank();
    }

    @Test
    void defaultContent_containsGermanKeywords() {
        String content = DefaultPromptTemplate.defaultContent(TEST_MAX_TITLE_LENGTH);
        assertThat(content).contains("Titel");
        assertThat(content).contains("Datum");
        assertThat(content).contains("Deutsch");
    }

    @Test
    void defaultContent_containsJsonSchemaHint() {
        String content = DefaultPromptTemplate.defaultContent(TEST_MAX_TITLE_LENGTH);
        // JSON-Felder müssen im Prompt beschrieben sein
        assertThat(content).contains("title");
        assertThat(content).contains("reasoning");
        assertThat(content).contains("date");
    }

    @Test
    void defaultContent_containsDateFormatHint() {
        String content = DefaultPromptTemplate.defaultContent(TEST_MAX_TITLE_LENGTH);
        assertThat(content).contains("YYYY-MM-DD");
    }

    @Test
    void defaultContent_mentionsConfiguredTitleMaxLength() {
        String content = DefaultPromptTemplate.defaultContent(42);
        // Der übergebene Wert muss im Text auftauchen
        assertThat(content).contains("42");
    }

    @Test
    void defaultContent_doesNotContainPlaceholderAfterReplacement() {
        String content = DefaultPromptTemplate.defaultContent(TEST_MAX_TITLE_LENGTH);
        assertThat(content).doesNotContain("{MAX_TITLE_LENGTH}");
    }

    @Test
    void defaultContent_isConsistent_calledTwice() {
        // Idempotenz-Prüfung: zwei Aufrufe mit gleichem Parameter liefern denselben Inhalt
        String first = DefaultPromptTemplate.defaultContent(TEST_MAX_TITLE_LENGTH);
        String second = DefaultPromptTemplate.defaultContent(TEST_MAX_TITLE_LENGTH);
        assertThat(first).isEqualTo(second);
    }

    @Test
    void defaultContent_rejectsZeroMaxTitleLength() {
        assertThatIllegalArgumentException()
                .isThrownBy(() -> DefaultPromptTemplate.defaultContent(0))
                .withMessageContaining("maxTitleLength must be >= 1");
    }

    @Test
    void defaultContent_containsTruncationInstruction() {
        String content = DefaultPromptTemplate.defaultContent(TEST_MAX_TITLE_LENGTH);
        // Die Kürzungsanweisung muss explizit vorhanden sein
        assertThat(content).contains("kürze");
        assertThat(content).contains("Abkürzungen");
        // Der Platzhalter wurde ersetzt, daher muss der numerische Wert mindestens zweimal erscheinen:
        // einmal in der Längenregel und einmal in der Kürzungsanweisung
        assertThat(content.split(String.valueOf(TEST_MAX_TITLE_LENGTH), -1).length - 1)
                .as("Die konfigurierte Titellänge (%d) muss mindestens zweimal im Prompt vorkommen",
                        TEST_MAX_TITLE_LENGTH)
                .isGreaterThanOrEqualTo(2);
    }
}
