import os, shutil, json
from pathlib import Path


# 递归读取文件夹tmpgui中的所有JSON文件
def read_json_files(directory, textkeylist):
    translation_dict = {}  # 用来存储所有的m_text值
    translation_set = set()
    it = list([1])

    def recursive_search(obj, key):
        if isinstance(obj, dict):
            for k, v in obj.items():
                if k == key:
                    if isinstance(v, str):
                        if v not in translation_set and v != "":
                            translation_set.add(v)
                            translation_dict[
                                f"{file.replace(".json", '')}-{key}-{it[0]}"
                            ] = v
                            it[0] += 1
                    elif isinstance(v, list):
                        for item in v:
                            if (
                                isinstance(item, str)
                                and item not in translation_set
                                and item != ""
                            ):
                                translation_set.add(item)
                                translation_dict[
                                    f"{file.replace(".json", '')}-{key}-{it[0]}"
                                ] = item
                                it[0] += 1
                            else:
                                recursive_search(item, key)
                else:
                    recursive_search(v, key)
        elif isinstance(obj, list):
            for item in obj:
                recursive_search(item, key)

    # 遍历目录中的所有文件和子目录
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(".json"):
                file_path = os.path.join(root, file)
                # 读取每个json文件
                with open(file_path, "r", encoding="utf-8") as f:
                    try:
                        data = json.load(f)
                        for key in textkeylist:
                            it[0] = 1
                            recursive_search(data, key)
                    except json.JSONDecodeError:
                        print(f"文件 {file_path} 解析错误")
    return translation_dict


def save_translation_dict(translation_dict, output_file):
    with open(output_file, "w", encoding="utf-8") as f:
        json.dump(translation_dict, f, ensure_ascii=False, indent=4)


# 将翻译导入回text
def import_translation(
    srcfolder, distfolder, textkeylist, translationsrc, translationdst
):
    shutil.copytree(srcfolder, "import_tmp")
    # 将翻译导入text,首先打开对应的json文件
    with open(translationsrc, "r") as f:
        src = json.load(f)
    with open(translationdst, "r") as f:
        dst = json.load(f)

    # 根据 src / dst 构建翻译字典
    transdict = dict()
    for key, item in src.items():
        if key in dst and dst[key] != "":
            transdict[item] = dst[key]
        else:
            transdict[item] = item

    # 遍历distfolder所有的json文件,使用递归来搜索对应的key
    # 遍历目录中的所有文件和子目录
    for root, _, files in os.walk("import_tmp"):
        for file in files:
            if file.endswith(".json"):
                file_path = os.path.join(root, file)
                # 读取每个json文件
                # 读取 json 文件
                with open(file_path, "r", encoding="utf-8") as f:
                    data = json.load(f)
                    # 对每个指定的 key 进行递归搜索并修改
                    for key in textkeylist:

                        def recursive_search(obj):
                            if isinstance(obj, dict):
                                for k, v in obj.items():
                                    if k == key:
                                        # 如果是字符串且存在于 transdict 中,直接修改
                                        if isinstance(v, str) and v in transdict:
                                            obj[k] = transdict[v]
                                        # 如果是列表,逐项检查
                                        elif isinstance(v, list):
                                            for idx, item in enumerate(v):
                                                if (
                                                    isinstance(item, str)
                                                    and item in transdict
                                                ):
                                                    obj[k][idx] = transdict[item]
                                                else:
                                                    recursive_search(item)
                                    else:
                                        recursive_search(v)
                            elif isinstance(obj, list):
                                for item in obj:
                                    recursive_search(item)

                        recursive_search(data)
                    with open(
                        f"{distfolder}/{os.path.basename(file_path)}",
                        "w",
                        encoding="utf-8",
                    ) as f:
                        json.dump(data, f, ensure_ascii=False, indent=2)
        shutil.rmtree("import_tmp")


if __name__ == "__main__":
    # 备份文件
    translation_key_mtext = [
        "m_text",
        "BIOSText",
        "SettingsElementName",
        "SettingsDescription",
        "ExtraName",
        "CreditNames",
        "CreditDescription",
        # 0304补充
        "GoalHint",
        "HypothesisName",
        "HypothesisTagline",
        "HypothesisDescription",
        "TimeWhenWritten",
        # 0319补充
        "LogName",
        # 0320补充
        "ItemName",
        "ItemTitle",
        "BattleInfo",
        "ItemDescription",
        "TopbarInfo",
        "KrisItemUsed_SusieDialogue",
        "KrisItemUsed_RalseiDialogue",
        "KrisItemUsed_NoelleDialogue",
        "SusieItemUsed_SusieDialogue",
        "SusieItemUsed_RalseiDialogue",
        "SusieItemUsed_NoelleDialogue",
        "RalseiItemUsed_SusieDialogue",
        "RalseiItemUsed_RalseiDialogue",
        "RalseiItemUsed_NoelleDialogue",
        "ActionName",
        "ActionDescription",
        "LargeImageText",
        "State",
        "Details",
        "VesselText",
        "ThisControlText",
        # 0327补充
        "controls",
    ]

    save_translation_dict(
        read_json_files("text", translation_key_mtext),
        "strings/mtext.json",
    )
    save_translation_dict(
        read_json_files("text", ["Text", "Array"]), "strings/dialogue.json"
    )
    backup_dir = "gamefile-backup"
    Path(backup_dir).mkdir(parents=True, exist_ok=True)
    Path(f"{backup_dir}/Managed").mkdir(parents=True, exist_ok=True)
    copy_dict = {
        "strings/dialogue.json": "translation-tools/weblate/dialogue/en.json",
        "strings/mtext.json": "translation-tools/weblate/mtext/en.json",
        "translation-tools/gamedata/Managed/Assembly-CSharp.dll": f"{backup_dir}/Managed",
        "translation-tools/gamedata/level*": f"{backup_dir}/",
        "translation-tools/gamedata/sharedassets*": f"{backup_dir}/",
    }
    for src, dst in copy_dict.items():
        os.system(f"cp -r {src} {dst}")
    if Path(f"{backup_dir}.7z").exists():
        Path(f"{backup_dir}.7z").unlink()
    os.system(f"7z a -mx1 {backup_dir}.zip {backup_dir}/*")
    shutil.rmtree(backup_dir)
    import_translation(
        "text",
        "text-cn",
        ["Text", "Array"],
        "translation-tools/weblate/dialogue/en.json",
        "translation-tools/weblate/dialogue/zh_CN.json",
    )

    import_translation(
        "text-cn",
        "text-cn",
        translation_key_mtext,
        "translation-tools/weblate/mtext/en.json",
        "translation-tools/weblate/mtext/zh_CN.json",
    )