import os
from os.path import dirname, join, exists
from ovos_utils.bracket_expansion import expand_options
from libretranslate_neon_plugin import LibreTranslatePlugin

tx = LibreTranslatePlugin(config={"libretranslate_host": "https://libretranslate.2022.us"})

src_lang = "en-us"
target_langs = ["es-es", "de-de", "fr-fr", "it-it", "pt-pt"]

exts = [".voc", ".dialog", ".intent", ".entity"]
res_folder = join(dirname(dirname(__file__)), "locale")
target_langs = list(set(target_langs + os.listdir(res_folder)))

src_files = {}
for root, dirs, files in os.walk(res_folder):
    if src_lang not in root:
        continue
    for f in files:
        if any(f.endswith(e) for e in exts):
            src_files[f] = join(root, f)

for lang in target_langs:
    os.makedirs(join(res_folder, lang), exist_ok=True)

    for name, src in src_files.items():
        if name.endswith(".dialog"):
            os.makedirs(join(res_folder, lang, "dialog"), exist_ok=True)
            dst = join(res_folder, lang, "dialog", name)
        elif name.endswith(".voc"):
            os.makedirs(join(res_folder, lang, "vocab"), exist_ok=True)
            dst = join(res_folder, lang, "vocab", name)
        elif name.endswith(".rx"):
            os.makedirs(join(res_folder, lang, "regex"), exist_ok=True)
            dst = join(res_folder, lang, "regex", name)
        elif name.endswith(".intent"):
            os.makedirs(join(res_folder, lang, "intents"), exist_ok=True)
            dst = join(res_folder, lang, "intents", name)
        else:
            dst = join(res_folder, lang, name)
        if exists(dst):
            continue

        tx_lines = []
        with open(src) as f:
            lines = [l for l in f.read().split("\n") if l and not l.startswith("#")]

        for l in lines:
            expanded = expand_options(l)
            for l2 in expanded:
                try:
                    translated = tx.translate(l2, target=lang, source=src_lang)
                    tx_lines.append(translated)
                except:
                    continue

        with open(dst, "w") as f:
            f.write(f"# auto translated from {src_lang} to {lang}\n")
            for translated in set(tx_lines):
                f.write(translated + "\n")
