package de.duehl.vocabulary.japanese.data.symbol;

import org.junit.jupiter.api.Test;

import de.duehl.basics.text.Text;

import static org.junit.jupiter.api.Assertions.*;

import java.util.List;

public class KanjiTypesTest {

    @Test
    public void checkIfGrundschuleKlasse1IsDisjunct() {
        idDisjunct(KanjiTypes.GRUNDSCHULE_KLASSE_1_KANJI_WIKI);
    }

    @Test
    public void checkIfGrundschuleKlasse2IsDisjunct() {
        idDisjunct(KanjiTypes.GRUNDSCHULE_KLASSE_2_KANJI_WIKI);
    }

    @Test
    public void checkIfGrundschuleKlasse3IsDisjunct() {
        idDisjunct(KanjiTypes.GRUNDSCHULE_KLASSE_3_KANJI_WIKI);
    }

    @Test
    public void checkIfGrundschuleKlasse4IsDisjunct() {
        idDisjunct(KanjiTypes.GRUNDSCHULE_KLASSE_4_KANJI_WIKI);
    }

    @Test
    public void checkIfGrundschuleKlasse5IsDisjunct() {
        idDisjunct(KanjiTypes.GRUNDSCHULE_KLASSE_5_KANJI_WIKI);
    }

    @Test
    public void checkIfGrundschuleKlasse6IsDisjunct() {
        idDisjunct(KanjiTypes.GRUNDSCHULE_KLASSE_6_KANJI_WIKI);
    }

    @Test
    public void checkIKyouikuKanjiIsDisjunct() {
        idDisjunct(KanjiTypes.KYOUIKU_KANJI_KANSHUDO);
    }

    @Test
    public void checkIfMittelschuleKlasse1IsDisjunct() {
        idDisjunct(KanjiTypes.MITTELSCHULE_KLASSE_1_KANJI_WIKI);
    }

    @Test
    public void checkIfMittelschuleKlasse2IsDisjunct() {
        idDisjunct(KanjiTypes.MITTELSCHULE_KLASSE_2_KANJI_WIKI);
    }

    @Test
    public void checkIfMittelschuleKlasse3IsDisjunct() {
        idDisjunct(KanjiTypes.MITTELSCHULE_KLASSE_3_KANJI_WIKI);
    }

    @Test
    public void checkIfJouyouKanjiIsDisjunct() {
        idDisjunct(KanjiTypes.JOUYOU_KANJI_KANSHUDO);
    }

    private void idDisjunct(String kanjiString) {
        List<String> kanjiList = Text.textToCharactersList(kanjiString);
        /* Geht aber liefert keine Erkenntnis!
        if (!CollectionsHelper.isDisjunct(kanjiList)) {
            fail();
        }
        */
        for (int index1 = 0; index1 < kanjiList.size()- 1; ++index1) {
            String kanji1 = kanjiList.get(index1);
            for (int index2 = index1 + 1; index2 < kanjiList.size(); ++index2) {
                String kanji2 = kanjiList.get(index2);
                if (kanji1.equals(kanji2)) {
                    fail("Kanji '" + kanji1 + "' ist mehr als einmal vorhanden.");
                }

            }
        }
    }

    @Test
    public void gundschule1Equal() {
        containesSameCharacters(
                KanjiTypes.GRUNDSCHULE_KLASSE_1_KANJI_WIKI,
                KanjiTypes.GRUNDSCHULE_KLASSE_1_KANJI_KANSHUDO);
    }

    @Test
    public void gundschule2Equal() {
        containesSameCharacters(
                KanjiTypes.GRUNDSCHULE_KLASSE_2_KANJI_WIKI,
                KanjiTypes.GRUNDSCHULE_KLASSE_2_KANJI_KANSHUDO);
    }

    @Test
    public void gundschule3Equal() {
        containesSameCharacters(
                KanjiTypes.GRUNDSCHULE_KLASSE_3_KANJI_WIKI,
                KanjiTypes.GRUNDSCHULE_KLASSE_3_KANJI_KANSHUDO);
    }

    @Test
    public void gundschule4Equal() {
        containesSameCharacters(
                KanjiTypes.GRUNDSCHULE_KLASSE_4_KANJI_WIKI,
                KanjiTypes.GRUNDSCHULE_KLASSE_4_KANJI_KANSHUDO);
    }

    @Test
    public void gundschule5Equal() {
        containesSameCharacters(
                KanjiTypes.GRUNDSCHULE_KLASSE_5_KANJI_WIKI,
                KanjiTypes.GRUNDSCHULE_KLASSE_5_KANJI_KANSHUDO);
    }

    @Test
    public void gundschule6Equal() {
        containesSameCharacters(
                KanjiTypes.GRUNDSCHULE_KLASSE_6_KANJI_WIKI,
                KanjiTypes.GRUNDSCHULE_KLASSE_6_KANJI_KANSHUDO);
    }

    @Test
    public void gundschuleEqual() {
        containesSameCharacters(
                KanjiTypes.KYOUIKU_KANJI_WIKI,
                KanjiTypes.KYOUIKU_KANJI_KANSHUDO);
    }

    @Test
    public void mittelschuleEqual() {
        containesSameCharacters(
                KanjiTypes.MITTELSCHUL_KANJI_WIKI,
                KanjiTypes.MITTELSCHUL_KANJI_KANSHUDO);
    }

    private void containesSameCharacters(String kanjiString1, String kanjiString2) {
        List<String> kanjiList1 = Text.textToCharactersList(kanjiString1);
        List<String> kanjiList2 = Text.textToCharactersList(kanjiString2);
        for (String kanji1 : kanjiList1) {
            if (!kanjiList2.contains(kanji1)) {
                fail("Das Kanji '" + kanji1 + "' aus der ersten Liste ist in der zweiten Liste "
                        + "nicht enthalten.");
            }
        }
        // Da die Mengen ja nicht disjunkt sein müssen auch andersherum:
        for (String kanji2 : kanjiList2) {
            if (!kanjiList1.contains(kanji2)) {
                fail("Das Kanji '" + kanji2 + "' aus der ersten zweiten ist in der ersten Liste "
                        + "nicht enthalten.");
            }
        }

        if (kanjiString1.length() != kanjiString2.length()) {
            fail("Verschieden Längen: " + kanjiString1.length() + " und " + kanjiString2.length());
        }
    }

    @Test
    public void kyouikuWikiSize() {
        if (1026 != KanjiTypes.KYOUIKU_KANJI_WIKI.length()) {
            fail("Falsch Länge: " + KanjiTypes.KYOUIKU_KANJI_WIKI.length() + " statt 1026");
        }
    }

    @Test
    public void kyouikuKanshudoSize() {
        if (1026 != KanjiTypes.KYOUIKU_KANJI_KANSHUDO.length()) {
            fail("Falsch Länge: " + KanjiTypes.KYOUIKU_KANJI_KANSHUDO.length() + " statt 1026");
        }
    }

    @Test
    public void mitelschulWikiSize() {
        if (1130 != KanjiTypes.MITTELSCHUL_KANJI_WIKI.length()) {
            fail("Falsch Länge: " + KanjiTypes.MITTELSCHUL_KANJI_WIKI.length() + " statt 1130");
        }
    }

    @Test
    public void mitelschulKanshudoSize() {
        if (1130 != KanjiTypes.MITTELSCHUL_KANJI_KANSHUDO.length()) {
            fail("Falsch Länge: " + KanjiTypes.MITTELSCHUL_KANJI_KANSHUDO.length() + " statt 1130");
        }
    }

    @Test
    public void jouyouWikiSize() {
        if (2136 != KanjiTypes.JOUYOU_KANJI_WIKI.length()) {
            fail("Falsch Länge: " + KanjiTypes.JOUYOU_KANJI_WIKI.length() + " statt 2136");
        }
    }

    @Test
    public void jouyouKanshudoSize() {
        if (2136 != KanjiTypes.JOUYOU_KANJI_KANSHUDO.length()) {
            fail("Falsch Länge: " + KanjiTypes.JOUYOU_KANJI_KANSHUDO.length() + " statt 2136");
        }
    }

}
