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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

/**
 * Diese Klasse erzeugt aus den mit dem KanjiStrokesReader eingelesenen, ehemals einmalig aus den
 * SVG-Dateien aus dem Kanji-VG Projekt ermittelten Pfade mit den Strichnummern, welche dann in
 * eine Datei in einem eigenen Format geschrieben wurden, eine für die weitere Verwendung sinnvolle
 * Datenstruktur.
 *
 *
 * 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 KanjiStrokesDataStructureGenerator {

    /** Die eingelesenen Pfade mit den Strichnummern. */
    private List<KanjiStrokePath> kanjiStrokePathes;

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

    /** Führt die Erzeugung der Datenstruktur durch. */
    public void generate() {
        readStrokePathes();
        initMap();
        fillMap();
    }

    private void readStrokePathes() {
        KanjiStrokesReader reader = new KanjiStrokesReader();
        reader.read();
        kanjiStrokePathes = reader.getKanjiStrokePathes();
    }

    private void initMap() {
        kanjiStrokesByCodePoint = new HashMap<>();
    }

    private void fillMap() {
        int codePoint = -1;
        List<KanjiStrokePath> kanjiStrokePathesOfActualKanji = new ArrayList<>();
        for (KanjiStrokePath kanjiStrokePath : kanjiStrokePathes) {
            int actualCodePoint = kanjiStrokePath.getCodePoint();
            if (actualCodePoint != codePoint) {
                if (!kanjiStrokePathesOfActualKanji.isEmpty()) {
                    kanjiStrokesByCodePoint.put(codePoint, kanjiStrokePathesOfActualKanji);
                    kanjiStrokePathesOfActualKanji = new ArrayList<>();
                }
                codePoint = actualCodePoint;
            }
            kanjiStrokePathesOfActualKanji.add(kanjiStrokePath);
        }
        if (!kanjiStrokePathesOfActualKanji.isEmpty()) {
            kanjiStrokesByCodePoint.put(codePoint, kanjiStrokePathesOfActualKanji);
        }
    }

    /** Getter für das Verzeichnis der Pfade mit den Strichnummern nach den Code-Points. */
    public Map<Integer, List<KanjiStrokePath>> getKanjiStrokesByCodePoint() {
        return kanjiStrokesByCodePoint;
    }

}
