# etsii mahdollisia virheitä yhdyssanalistalta;
# tarkoitettu lähinnä qallen omaan käyttöön;
# ajetaan ohjelman convert.py jälkeen

from itertools import chain

COMPOUNDS_FILE = "compounds.txt"  # luettava yhdyssanatiedosto

MIN_WORD_LEN = 2  # minimipituus osille, joiksi yhdyssanat yritetään jakaa

def read_lines(filename):
    # generoi UTF-8-tekstitiedoston rivit ilman rivinvaihtoja
    with open(filename, "rt", encoding="utf8") as handle:
        handle.seek(0)
        for line in handle:
            yield line.rstrip("\n")

def get_compounds(filename):
    # generoi jokainen yhdyssana tuplena
    for compound in read_lines(filename):
        # U+2011 = non-breaking hyphen
        yield tuple(p.rstrip("-\u2011 ") for p in compound.split("_"))

def split_in_two(word):
    # generoi kahden merkkijonon tupleja
    for i in range(MIN_WORD_LEN, len(word) - MIN_WORD_LEN + 1):
        yield (word[:i], word[i:])

def split_in_three(word):
    # generoi kolmen merkkijonon tupleja
    for i in range(MIN_WORD_LEN, len(word) - MIN_WORD_LEN * 2 + 1):
        for j in range(i + MIN_WORD_LEN, len(word) - MIN_WORD_LEN + 1):
            yield (word[:i], word[i:j], word[j:])

def split_in_four(word):
    # generoi neljän merkkijonon tupleja
    for i in range(MIN_WORD_LEN, len(word) - MIN_WORD_LEN * 3 + 1):
        for j in range(i + MIN_WORD_LEN, len(word) - MIN_WORD_LEN * 2 + 1):
            for k in range(j + MIN_WORD_LEN, len(word) - MIN_WORD_LEN + 1):
                yield (word[:i], word[i:j], word[j:k], word[k:])

def print_result(compound, parts):
    # argumentit tupleina
    print(format("_".join(compound), "30") + ": " + "_".join(parts))

def main():
    # lue yhdyssanat
    compounds = list(get_compounds(COMPOUNDS_FILE))
    nonFinalParts = set(chain.from_iterable(c[:-1] for c in compounds))
    finalParts    = set(                    c[ -1] for c in compounds)

    print("Yhdyssanoja:", len(compounds))
    print("Osia yhteensä:", sum(len(c) for c in compounds))
    print("Eri ei-viimeisiä osia:", len(nonFinalParts))
    print("Eri viimeisiä    osia:", len(finalParts))
    print()
    print("Sarakkeet:")
    print("  - vasen: sana compounds.txt:stä; sen pitäisi olla aina järkevä")
    print("  - oikea: sama sana eri lailla jaettuna; sen pitäisi olla aina")
    print("    *järjetön* (mutta usein hauska)")
    print()

    for partCnt in range(2, 4 + 1):
        print(f"Yritetään muodostaa {partCnt}-osaisia yhdyssanoja:")
        split_function = {
            2: split_in_two,
            3: split_in_three,
            4: split_in_four,
        }[partCnt]
        for compound in compounds:
            for parts in split_function("".join(compound)):
                if (
                    all(p in nonFinalParts for p in parts[:-1])
                    and parts[-1] in finalParts
                    and parts != compound
                ):
                    print_result(compound, parts)
        print()


main()
