package de.duehl.vocabulary.japanese.logic.symbol.kanji.strokes.own.data;

import java.util.List;
import java.util.Map;

import de.duehl.vocabulary.japanese.logic.symbol.kanji.strokes.tools.CodePointTools;

/**
 * Diese Klasse stellt die Datenstruktur mit den Strichen der Kanji für die Darstellung dieser in
 * der grafischen Oberfläche dar.
 *
 * Die Pfade wurden ehemals einmalig aus den SVG-Dateien aus dem Kanji-VG Projekt eingelesen und
 * dann in eine Datei in einem eigenen Format geschrieben. Aus dieser stammen die hier
 * dargestellten Pfade.
 *
 * Zu Kanji-VG siehe:
 *
 * https://github.com/KanjiVG/kanjivg
 *
 * KanjiVG is copyright Ulrich Apel and released under the Creative Commons Attribution-Share
 * Alike 3.0 licence: http://creativecommons.org/licenses/by-sa/3.0/
 *
 * The project's documentation is at https://kanjivg.tagaini.net/.
 *
 * @version 1.01     2026-08-19
 * @author Christian Dühl
 */

public class KanjiStrokes {

    /** Das Verzeichnis der Pfade mit den Strichnummern nach den Code-Points. */
    private final Map<Integer, List<KanjiStrokePath>> kanjiStrokesByCodePoint;

    /**
     * Konstruktor.
     *
     * @param kanjiStrokesByCodePoint
     *            Das Verzeichnis der Pfade mit den Strichnummern nach den Code-Points.
     */
    public KanjiStrokes(Map<Integer, List<KanjiStrokePath>> kanjiStrokesByCodePoint) {
        this.kanjiStrokesByCodePoint = kanjiStrokesByCodePoint;
    }

    /** Gibt die Anzahl der Kanji bzw. Code-Points zurück, zu denen die Striche hinterlegt sind. */
    public int size() {
        return kanjiStrokesByCodePoint.size();
    }

    /** Gibt an, ob Strichfolgen zum übergebenen Kanji bekannt sind. */
    public boolean knowsPathesForKanji(String kanji) {
        int codePoint = CodePointTools.characterToCodePoint(kanji);
        return knowsPathesForCodePoint(codePoint);
    }

    /** Gibt an, ob Strichfolgen zum übergebenen Code-Point bekannt sind. */
    private boolean knowsPathesForCodePoint(int codePoint) {
        return kanjiStrokesByCodePoint.containsKey(codePoint);
    }

    /** Gibt die Strichfolgen zum übergebenen Kanji zurück. */
    public List<KanjiStrokePath> getPathesByKanji(String kanji) {
        if (!knowsPathesForKanji(kanji)) {
            throw new RuntimeException(""
                    + "Zum Kanji '" + kanji + "' sind keine Strichfolgen bekannt.\n"
                    + "Bitte vorher mit knowsPathesForKanji(kanji) überprüfen.\n");
        }
        int codePoint = CodePointTools.characterToCodePoint(kanji);
        return getPathesByCodePoint(codePoint);
    }

    /** Gibt die Strichfolgen zum übergebenen Code-Point zurück. */
    public List<KanjiStrokePath> getPathesByCodePoint(int codePoint) {
        if (!kanjiStrokesByCodePoint.containsKey(codePoint)) {
            throw new RuntimeException(
                    "Zum Code-Point '" + codePoint + "' sind keine Strichfolgen bekannt.");
        }
        return kanjiStrokesByCodePoint.get(codePoint);
    }

}
