import os
import shutil
from stuff.general import General
from tools.logger import Logger


class MicroG(General):
    id = "MicroG"
    partition = "system"
    fdroid_repo_apks = {
        "com.aurora.store_41.apk": "9e6c79aefde3f0bbfedf671a2d73d1be",
        "com.etesync.syncadapter_20300.apk": "997d6de7d41c454d39fc22cd7d8fc3c2",
        "com.aurora.adroid_8.apk": "0010bf93f02c2d18daf9e767035fefc5",
        "org.fdroid.fdroid.privileged_2130.apk": "b04353155aceb36207a206d6dd14ba6a",
        "org.microg.nlp.backend.ichnaea_20036.apk": "0b3cb65f8458d1a5802737c7392df903",
        "org.microg.nlp.backend.nominatim_20042.apk": "88e7397cbb9e5c71c8687d3681a23383",
    }
    microg_apks= {
        "com.google.android.gms-223616054.apk": "a945481ca5d33a03bc0f9418263c3228",
        "com.google.android.gsf-8.apk": "b2b4ea3642df6158e14689a4b2a246d4",
        "com.android.vending-22.apk": "6815d191433ffcd8fa65923d5b0b0573",
        "org.microg.gms.droidguard-14.apk": "4734b41c1a6bc34a541053ddde7a0f8e"
    }
    priv_apps = ["com.google.android.gms", "com.android.vending"]
    dl_links = {
        "Standard": [
            "https://github.com/ayasa520/MinMicroG/releases/download/latest/MinMicroG-Standard-2.11.1-20230429100529.zip",
            "0fe332a9caa3fbb294f2e2b50f720c6b"
        ],
        "NoGoolag": [
            "https://github.com/ayasa520/MinMicroG/releases/download/latest/MinMicroG-NoGoolag-2.11.1-20230429100545.zip",
            "ff920f33f4c874eeae4c0444be427c68"
        ],
        "UNLP": [
            "https://github.com/ayasa520/MinMicroG/releases/download/latest/MinMicroG-UNLP-2.11.1-20230429100555.zip",
            "6136b383153c2a6797d14fb4d7ca3f97"
        ],
        "Minimal": [
            "https://github.com/ayasa520/MinMicroG/releases/download/latest/MinMicroG-Minimal-2.11.1-20230429100521.zip"
            "afb87eb64e7749cfd72c4760d85849da"
        ],
        "MinimalIAP": [
            "https://github.com/ayasa520/MinMicroG/releases/download/latest/MinMicroG-MinimalIAP-2.11.1-20230429100556.zip"
            "cc071f4f776cbc16c4c1f707aff1f7fa"
        ]
    }
    dl_link = ...
    act_md5 = ...
    dl_file_name = ...
    sdk = ...
    extract_to = "/tmp/microg/extract"
    rc_content = '''
on property:sys.boot_completed=1
    start microg_service

service microg_service /system/bin/sh /system/bin/npem
    user root
    group root
    oneshot
    '''
    files = [
        "priv-app/GoogleBackupTransport",
        "priv-app/MicroGUNLP",
        "priv-app/MicroGGMSCore",
        "priv-app/MicroGGMSCore/lib/x86_64/libmapbox-gl.so",
        "priv-app/MicroGGMSCore/lib/x86_64/libconscrypt_gmscore_jni.so",
        "priv-app/MicroGGMSCore/lib/x86_64/libcronet.102.0.5005.125.so",
        "priv-app/PatchPhonesky",
        "priv-app/PatchPhonesky/lib/x86_64/libempty_x86_64.so",
        "priv-app/AuroraServices",
        "bin/npem",
        "app/GoogleCalendarSyncAdapter",
        "app/NominatimNLPBackend",
        "app/MicroGGSFProxy",
        "app/LocalGSMNLPBackend",
        "app/DejaVuNLPBackend",
        "app/MozillaUnifiedNLPBackend",
        "app/AppleNLPBackend",
        "app/AuroraDroid",
        "app/LocalWiFiNLPBackend",
        "app/GoogleContactsSyncAdapter",
        "app/MicroGGSFProxy/MicroGGSFProxy",
        "framework/com.google.widevine.software.drm.jar",
        "framework/com.google.android.media.effects.jar",
        "framework/com.google.android.maps.jar",
        "lib64/libjni_keyboarddecoder.so",
        "lib64/libjni_latinimegoogle.so",
        "etc/default-permissions/microg-permissions.xml",
        "etc/default-permissions/microg-permissions-unlp.xml",
        "etc/default-permissions/gsync.xml",
        "etc/sysconfig/nogoolag.xml",
        "etc/sysconfig/nogoolag-unlp.xml",
        "etc/init/microg.rc",
        "etc/permissions/com.google.android.backuptransport.xml",
        "etc/permissions/com.android.vending.xml",
        "etc/permissions/foss-permissions.xml",
        "etc/permissions/com.google.android.gms.xml",
        "etc/permissions/com.aurora.services.xml",
        "etc/permissions/com.google.android.maps.xml",
        "etc/permissions/com.google.widevine.software.drm.xml",
        "etc/permissions/com.google.android.media.effects.xml",
        "lib/libjni_keyboarddecoder.so",
        "lib/libjni_latinimegoogle.so",
    ]

    def __init__(self, android_version="11", variant="Standard") -> None:
        super().__init__()
        self.dl_link = self.dl_links[variant][0]
        self.act_md5 = self.dl_links[variant][1]
        self.id = self.id+f"-{variant}"
        self.dl_file_name = f'MinMicroG-{variant}.zip'
        if android_version == "11":
            self.sdk = 30
        elif android_version == "13":
            self.sdk = 33

    def copy(self):
        Logger.info("Copying libs and apks...")
        dst_dir = os.path.join(self.copy_dir, self.partition)
        src_dir = os.path.join(self.extract_to, "system")
        if "arm" in self.arch[0]:
            sub_arch = "arm"
        else:
            sub_arch = "x86"
        if 64 == self.arch[1]:
            arch = f"{sub_arch}{'' if sub_arch=='arm' else '_'}64"
        for root, dirs, files in os.walk(src_dir):
            flag = False
            dir_name = os.path.basename(root)
            # ้ๅކๆ–‡ไปถ
            if dir_name.startswith('-') and dir_name.endswith('-'):
                archs, sdks = [], []
                for i in dir_name.split("-"):
                    if i.isdigit():
                        sdks.append(i)
                    elif i:
                        archs.append(i)
                if len(archs) != 0 and arch not in archs and sub_arch not in archs or len(sdks) != 0 and str(self.sdk) not in sdks:
                    continue
                else:
                    flag = True

            for file in files:
                src_file_path = os.path.join(root, file)
                if not flag:
                    dst_file_path = os.path.join(dst_dir, os.path.relpath(
                        src_file_path, src_dir))
                else:
                    dst_file_path = os.path.join(dst_dir, os.path.relpath(
                        os.path.join(os.path.dirname(root), file), src_dir))
                if not os.path.exists(os.path.dirname(dst_file_path)):
                    os.makedirs(os.path.dirname(dst_file_path))
                # Logger.info(f"{src_file_path} -> {dst_file_path}")
                shutil.copy2(src_file_path, dst_file_path)
                if os.path.splitext(dst_file_path)[1].lower() == ".apk":
                    self.extract_app_lib(dst_file_path)

        rc_dir = os.path.join(dst_dir, "etc/init/microg.rc")
        if not os.path.exists(os.path.dirname(rc_dir)):
            os.makedirs(os.path.dirname(rc_dir))
        with open(rc_dir, "w") as f:
            f.write(self.rc_content)

    def extra2(self):
        system_dir = os.path.join(self.copy_dir, self.partition)
        files = [key.split("_")[0] for key in self.fdroid_repo_apks.keys()]
        files += [key.split("-")[0] for key in self.microg_apks.keys()]
        for f in files:
            if f in self.priv_apps:
                file = os.path.join(system_dir, "priv-app", f)
            else:
                file = os.path.join(system_dir, "app", f)
            if os.path.isdir(file):
                shutil.rmtree(file)
            elif os.path.isfile(file):
                os.remove(file)