package de.gecheckt.pdf.umbenenner.application.service;

/**
 * Kanonische Regel für erlaubte Titelzeichen.
 * <p>
 * Ein Titel darf nur Unicode-Buchstaben (einschließlich deutscher Umlaute und ß),
 * Ziffern, ASCII-Leerzeichen, Bindestriche ({@code -}), Punkte ({@code .}),
 * Kommas ({@code ,}) und Ampersands ({@code &}) enthalten.
 * Alle anderen Zeichen sind nicht erlaubt.
 * <p>
 * Diese Klasse ist die einzige autoritative Implementierung der Zeichenerlaubnis-Regel.
 * Alle Services, die Titelzeichen validieren müssen, delegieren an {@link #isAllowed(String)}.
 */
public final class TitleCharacterRule {

    private TitleCharacterRule() {
        // utility class
    }

    /**
     * Gibt {@code true} zurück, wenn jedes Zeichen im {@code title} ein Buchstabe, eine Ziffer,
     * ein ASCII-Leerzeichen, ein Bindestrich ({@code -}), ein Punkt ({@code .}),
     * ein Komma ({@code ,}) oder ein Ampersand ({@code &}) ist.
     * <p>
     * Unicode-Buchstaben — einschließlich deutscher Umlaute (ä, ö, ü, Ä, Ö, Ü) und ß — sind
     * erlaubt. Eine leere Zeichenkette ist erlaubt.
     *
     * @param title der zu prüfende Titel; darf nicht null sein
     * @return {@code true} wenn alle Zeichen die Erlaubnisliste erfüllen; {@code false} andernfalls
     * @throws NullPointerException wenn {@code title} null ist
     */
    public static boolean isAllowed(String title) {
        for (int i = 0; i < title.length(); i++) {
            char c = title.charAt(i);
            // Erlaubt: Buchstaben, Ziffern, Leerzeichen, Bindestrich, Punkt, Komma, Ampersand
            if (!Character.isLetter(c) && !Character.isDigit(c) && c != ' ' && c != '-'
                    && c != '.' && c != ',' && c != '&') {
                return false;
            }
        }
        return true;
    }
}
