"""Изменяет имя пакета в apk, удаляет вход по google и vk

"package_name": {
  "enabled": true,
  "new_package_name": "com.wowlikon.anixart"
}
"""

__author__ = "wowlikon <wowlikon@gmail.com>"
__version__ = "1.0.0"
import os
from typing import Any, Dict

from lxml import etree
from pydantic import Field

from utils.config import PatchTemplate


class Patch(PatchTemplate):
    priority: int = Field(frozen=True, exclude=True, default=-1)
    package_name: str = Field("com.wowlikon.anixart", description="Название пакета")

    def rename_dir(self, src, dst):
        os.makedirs(os.path.dirname(dst), exist_ok=True)
        os.rename(src, dst)

    def apply(self, base: Dict[str, Any]) -> bool:
        for root, dirs, files in os.walk("./decompiled"):
            for filename in files:
                file_path = os.path.join(root, filename)

                if os.path.isfile(file_path):
                    try:  # Изменяем имя пакета в файлах
                        with open(file_path, "r", encoding="utf-8") as file:
                            file_contents = file.read()

                        new_contents = file_contents.replace(
                            "com.swiftsoft.anixartd", self.package_name
                        )
                        new_contents = new_contents.replace(
                            "com/swiftsoft/anixartd",
                            self.package_name.replace(".", "/"),
                        ).replace(
                            "com/swiftsoft",
                            "/".join(self.package_name.split(".")[:2]),
                        )
                        with open(file_path, "w", encoding="utf-8") as file:
                            file.write(new_contents)
                    except:
                        pass

        # Изменяем названия папок
        if os.path.exists("./decompiled/smali/com/swiftsoft/anixartd"):
            self.rename_dir(
                "./decompiled/smali/com/swiftsoft/anixartd",
                os.path.join(
                    "./decompiled", "smali", self.package_name.replace(".", "/")
                ),
            )
        if os.path.exists("./decompiled/smali_classes2/com/swiftsoft/anixartd"):
            self.rename_dir(
                "./decompiled/smali_classes2/com/swiftsoft/anixartd",
                os.path.join(
                    "./decompiled",
                    "smali_classes2",
                    self.package_name.replace(".", "/"),
                ),
            )
        if os.path.exists("./decompiled/smali_classes4/com/swiftsoft"):
            self.rename_dir(
                "./decompiled/smali_classes4/com/swiftsoft",
                os.path.join(
                    "./decompiled",
                    "smali_classes4",
                    "/".join(self.package_name.split(".")[:2]),
                ),
            )

        # rename_dir(
        #    "./decompiled/smali_classes3/com/swiftsoft/anixartd",
        #    os.path.join(
        #        "./decompiled",
        #        "smali_classes3",
        #        config["new_package_name"].replace(".", "/"),
        #    ),
        # )

        # Замена названия пакета для smali_classes4
        for root, dirs, files in os.walk("./decompiled/smali_classes4/"):
            for filename in files:
                file_path = os.path.join(root, filename)

                if os.path.isfile(file_path):
                    try:
                        with open(file_path, "r", encoding="utf-8") as file:
                            file_contents = file.read()

                        new_contents = file_contents.replace(
                            "com/swiftsoft",
                            "/".join(self.package_name.split(".")[:-1]),
                        )
                        with open(file_path, "w", encoding="utf-8") as file:
                            file.write(new_contents)
                    except:
                        pass

        # Скрытие входа по Google и VK (НЕ РАБОТАЮТ В МОДАХ)
        file_path = "./decompiled/res/layout/fragment_sign_in.xml"
        parser = etree.XMLParser(remove_blank_text=True)
        tree = etree.parse(file_path, parser)
        root = tree.getroot()

        last_linear = root.xpath("//LinearLayout/LinearLayout[4]")[0]
        last_linear.set(f"{{{base['xml_ns']['android']}}}visibility", "gone")

        tree.write(file_path, pretty_print=True, xml_declaration=True, encoding="utf-8")

        return True
