package de.gecheckt.pdf.umbenenner.adapter.in.gui.batchrun;

/**
 * Übersetzt strukturierte Fehlermeldungen aus der Anwendungsschicht in
 * benutzerfreundliche deutsche Texte für die Darstellungsschicht der GUI.
 * <p>
 * Die Klasse wertet die englischsprachige Fehlermeldung aus dem Verarbeitungsversuch
 * musterbasiert aus und liefert eine für den Endbenutzer lesbare Beschreibung des
 * Fehlergrunds. Das ursprüngliche Datenmodell bleibt unverändert; die Übersetzung
 * findet ausschließlich in der Darstellungsschicht statt.
 * <p>
 * Die Mustererkennung erfolgt ohne Berücksichtigung der Groß-/Kleinschreibung
 * und prüft die definierten Schlüsselbegriffe in festgelegter Reihenfolge,
 * damit spezifischere Muster vor allgemeineren greifen.
 * <p>
 * Die Klasse wird sowohl im Verarbeitungslauf-Tab als auch im Verlauf-Tab verwendet.
 */
public final class AiFailureMessageTranslator {

    private AiFailureMessageTranslator() {
    }

    /**
     * Liefert eine benutzerfreundliche deutsche Fehlermeldung für die angegebene
     * technische Fehlerbeschreibung.
     * <p>
     * Ist {@code technicalMessage} {@code null} oder leer, wird der allgemeine
     * Fallback-Text zurückgegeben. Für eine nicht leere, aber keinem Muster zuordenbare
     * Meldung wird die technische Originalmeldung sichtbar angehängt, damit die tatsächliche
     * Ursache nicht hinter einem generischen Platzhalter verborgen bleibt.
     *
     * @param technicalMessage die rohe technische Fehlermeldung; darf {@code null} sein
     * @return eine nicht-leere deutsche Benutzerfehlermeldung ohne führendes Warnsymbol
     */
    public static String translate(String technicalMessage) {
        if (technicalMessage == null || technicalMessage.isBlank()) {
            return "Verarbeitung fehlgeschlagen. Bitte Konfiguration prüfen und ggf. erneut verarbeiten.";
        }
        String lower = technicalMessage.toLowerCase(java.util.Locale.ROOT);

        // Pre-Check-Fehler: kein lesbarer Text im PDF
        if (lower.contains("no usable text")) {
            return "PDF enthält keinen lesbaren Text. Möglicherweise handelt es sich um einen Scan"
                    + " ohne Texterkennung (OCR). Eine automatische Benennung ist nicht möglich.";
        }

        // KI-Validierungsfehler: Titel überschreitet die konfigurierte Maximallänge
        if (lower.contains("title exceeds")) {
            return buildTitleExceedsMessage(technicalMessage);
        }

        // Defekte oder strukturell nicht lesbare PDF-Datei
        if (lower.contains("content not extractable")
                || lower.contains("ioexception")
                || lower.contains("end of file")
                || lower.contains("endoffileexception")
                || lower.contains("eof")) {
            return "Die PDF-Datei ist ungültig oder beschädigt und kann nicht verarbeitet werden.";
        }

        // HTTP-Authentifizierungsfehler
        if (lower.contains("http_401")) {
            return "KI-Dienst: Ungültiger API-Schlüssel. Bitte in den Einstellungen prüfen.";
        }
        if (lower.contains("http_403")) {
            return "KI-Dienst: Zugriff verweigert. Bitte API-Schlüssel und Berechtigungen prüfen.";
        }
        if (lower.contains("http_429")) {
            return "KI-Dienst: Anfragelimit erreicht. Bitte später erneut versuchen.";
        }
        if (lower.contains("http_5")) {
            return "KI-Dienst vorübergehend nicht erreichbar. Bitte später erneut versuchen.";
        }

        // Netzwerk- und Verbindungsfehler
        if (lower.contains("connection") || lower.contains("timeout") || lower.contains("refused")) {
            return "KI-Dienst nicht erreichbar. Bitte Verbindung und Konfiguration prüfen.";
        }

        // KI-Antwort strukturell nicht verwertbar (kein/ungültiges JSON, Zusatztext, Pflichtfeld fehlt)
        if (lower.contains("not_json_object") || lower.contains("not a pure json")
                || lower.contains("invalid_json") || lower.contains("could not be parsed")
                || lower.contains("empty_response")
                || lower.contains("missing_title") || lower.contains("blank_title")
                || lower.contains("missing_reasoning")) {
            return "KI-Antwort war nicht im erwarteten Format (kein gültiges JSON). "
                    + "Bitte erneut verarbeiten; hält der Fehler an, den Prompt anpassen.";
        }

        // Unbekannter technischer Fehler: die echte technische Meldung sichtbar machen,
        // statt sie hinter einem generischen Platzhalter zu verbergen.
        return "Verarbeitung fehlgeschlagen. Technischer Grund: " + technicalMessage;
    }

    /**
     * Baut aus einer „Title exceeds"-Fehlermeldung einen benutzerfreundlichen Text,
     * der Titel, tatsächliche Länge und konfiguriertes Limit nennt.
     * <p>
     * Erwartet wird das Format:
     * {@code … Title exceeds N characters (base title): 'Titel' …}
     * <p>
     * Kann das Format nicht geparst werden, wird ein generischer Hinweis zurückgegeben.
     *
     * @param technicalMessage die vollständige technische Fehlermeldung
     * @return benutzerfreundlicher Hinweis auf den zu langen Titel
     */
    private static String buildTitleExceedsMessage(String technicalMessage) {
        try {
            int exceedsIdx = technicalMessage.indexOf("Title exceeds ");
            if (exceedsIdx >= 0) {
                String afterExceeds = technicalMessage.substring(exceedsIdx + "Title exceeds ".length());
                int charIdx = afterExceeds.indexOf(" characters");
                if (charIdx > 0) {
                    int limit = Integer.parseInt(afterExceeds.substring(0, charIdx).trim());
                    int colonQuote = technicalMessage.indexOf(": '", exceedsIdx);
                    if (colonQuote >= 0) {
                        String afterQuote = technicalMessage.substring(colonQuote + 3);
                        int closingQuote = afterQuote.lastIndexOf("'");
                        if (closingQuote > 0) {
                            String title = afterQuote.substring(0, closingQuote);
                            return "KI-Vorschlag abgelehnt: '" + title + "' ist zu lang ("
                                    + title.length() + " Zeichen, Limit: " + limit
                                    + "). Bitte Dateinamen manuell kürzen.";
                        }
                    }
                }
            }
        } catch (NumberFormatException | StringIndexOutOfBoundsException ignored) {
            // Fallback unten
        }
        return "KI-Vorschlag abgelehnt: Titel überschreitet die maximale Länge. Bitte Dateinamen manuell kürzen.";
    }
}
