# -*- coding: utf-8 -*-
"""
yjk_launcher.py —— 一句成课(tm) 安装器引导桩（明文外壳，不含密钥）

职责：在用户激活之前启动安装器 GUI（setup_gui_v6p1t）。
机制：安装一个 MetaPathFinder，按需从 .py.vault 在内存解密白名单内的脚本
      （免授权网关、不落盘明文）；主入口 setup_gui_v6p1t 以 __main__ 身份
      触发其 main()。分发包始终保持加密态。
"""
import os
import sys
import importlib.abc
import importlib.machinery

HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, HERE)

import decrypt_assets as da

ALLOWED = da._lock_set()  # lock_manifest.json 白名单（setup_gui / license_core / activate_gui / setup_gui_v6p1t ...）


class _VaultFinder(importlib.abc.MetaPathFinder):
    """拦截白名单内模块的 import，从 .py.vault 内存解密后加载。"""

    def find_spec(self, name, path, target=None):
        if name not in ALLOWED:
            return None
        vault = os.path.join(HERE, name + ".py.vault")
        if not os.path.isfile(vault):
            return None
        return importlib.machinery.ModuleSpec(name, _VaultLoader(name, vault), origin=vault)


class _VaultLoader(importlib.abc.Loader):
    def __init__(self, name, vault):
        self.name = name
        self.vault = vault

    def create_module(self, spec):
        return None

    def exec_module(self, module):
        if self.name == "setup_gui_v6p1t":
            # 主入口：以 __main__ 身份执行，触发文件尾部 if __name__ == "__main__": main()
            module.__name__ = "__main__"
            sys.modules["__main__"] = module
        code = da._raw_decrypt(self.vault).decode("utf-8")
        module.__file__ = self.vault
        module.__package__ = ""
        exec(compile(code, self.name + ".py", "exec"), module.__dict__)


sys.meta_path.insert(0, _VaultFinder())

if __name__ == "__main__":
    import setup_gui_v6p1t  # 由 _VaultFinder 解密并以 __main__ 身份加载 -> 触发 main()
