package de.duehl.vocabulary.japanese.startup.logic.steps;

import java.util.ArrayList;
import java.util.List;

import de.duehl.basics.datetime.time.watch.StopWatch;
import de.duehl.basics.text.Text;
import de.duehl.vocabulary.japanese.common.persistence.Options;
import de.duehl.vocabulary.japanese.data.symbol.Kanji;
import de.duehl.vocabulary.japanese.startup.ui.data.SplashScreenable;

/**
 * Diese Klasse steht für den Schritt der überprüft, ob es bei den Kanji jedes Kanji-Zeichen nur
 * einmal gibt, und ob andere Probleme auftauchen.
 *
 * Es war einmal vorgekommen, dass ich ein Kanji unter zwei unterschiedlichen Namen zweimal in der
 * Kanji-Enum-Klasse hatte (HIMMEL und HIMMEL_PARADIES).
 *
 * @version 1.01     2026-08-20
 * @author Christian Dühl
 */

public class Step11CheckKanji extends StartupStep {

    /** Die hier aufgetretenen Fehler. */
    private List<String> errors;

    /**
     * Konstruktor.
     *
     * @param step
     *            Der Schritt der durchgeführt wird.
     * @param options
     *            Die Programmoptionen.
     * @param splashScreen
     *            Die grafische Oberfläche beim Start in der die Meldungen angezeigt werden.
     * @param watch
     *            Misst die Laufzeit des gesamten Startups.
     */
    public Step11CheckKanji(String step, Options options, SplashScreenable splashScreen,
            StopWatch watch) {
        super(step, options, splashScreen, watch);
    }

    /** Führt den eigentlichen Inhalt des Schritts aus. */
    @Override
    protected void runInternalStep() {
        errors = new ArrayList<>();

        checkDoubkleKanji();
        checkCharacterLengthIsOne();
        checkCharacterIsContainedInExampleKanjiWord();

        handleErrors();
    }

    private void checkDoubkleKanji() {
        appendMessage("Prüfe Kanji auf Dublettenfreiheit ...");
        List<String> seenKanjiCharacters = new ArrayList<>();

        for (Kanji kanji : Kanji.getAllKanjiAsList()) {
            String character = kanji.getCharacter();
            if (seenKanjiCharacters.contains(character)) {
                String message = "Zum Kanji '" + character + "' sind mehr als ein "
                        + "Enum-Element in der Klasse Kanji hinterlegt.";
                errors.add(message);
                appendMessage("    " + message);
            }
            seenKanjiCharacters.add(character);
        }
    }

    private void checkCharacterLengthIsOne() {
        appendMessage("Prüfe die Länge der Kanji-Zeichen ...");

        for (Kanji kanji : Kanji.getAllKanjiAsList()) {
            String character = kanji.getCharacter();
            if (character.length() != 1) {
                String message = "Zum Kanji '" + character + "' ist das Kanji-Zeichen nicht "
                        + "genau ein Zeichen lang.";
                errors.add(message);
                appendMessage("    " + message);
            }
        }
    }

    private void checkCharacterIsContainedInExampleKanjiWord() {
        appendMessage("Prüfe ob die Kanji-Zeichen im Beispiel-Kanji-Wort enthalten sind ...");

        for (Kanji kanji : Kanji.getAllKanjiAsList()) {
            String character = kanji.getCharacter();
            String kanjiHiraganaWord = kanji.getNormalKanjiHiraganaWord();
            if (!kanjiHiraganaWord.isBlank() && !kanjiHiraganaWord.contains(character)) {
                String message = "Zum Kanji '" + character + "' ist das Kanji-Zeichen nicht "
                        + "im Beispiel-Kanji-Wort enthalten.";
                errors.add(message);
                appendMessage("    " + message);
            }
        }
    }

    private void handleErrors() {
        if (!errors.isEmpty()) {
            errorsInStep(Text.joinWithLineBreak(errors));
        }
    }

}
