import sys, os
import subprocess
import tkinter as tk
from tkinter import messagebox

_TK_ROOT = None # 內部全域變數，用於管理 Tkinter root 實例
REPO_URL = "https://github.com/rogers228/ispc_maintain.git"
TARGET_DIR = os.path.join(os.environ["USERPROFILE"], "Documents", "ispc_maintain")

print('clone_ispc_maintain...')

def get_or_create_tk_root():
    global _TK_ROOT
    if _TK_ROOT is None:
        root = tk.Tk() # 創建 Tkinter 根視窗
        root.withdraw() # 隱藏根視窗，確保只看到彈出的訊息框
        _TK_ROOT = root
    return _TK_ROOT

def msgbox(title, message):
    root = get_or_create_tk_root()
    messagebox.showinfo(
        title=title,
        message=message
    )

def check_git_installed():
    # 檢查系統 PATH 中是否能找到 git 執行檔。
    print("🔎 檢查 Git 工具是否安裝...")
    try:
        # 嘗試執行一個簡單的 git 命令，並在 shell 中尋找 'git'
        subprocess.run(['git', '--version'],
                       check=True,
                       capture_output=True)

        return True
    except (FileNotFoundError, subprocess.CalledProcessError):
        # FileNotFoundError: 通常表示在 PATH 中找不到 'git' (Windows)
        # CalledProcessError: 表示找到 'git' 但執行失敗 (不常見，但作為防護)
        return False
    except Exception as e:
        # 捕獲其他未預期的錯誤
        print(f"⚠️ 檢查 Git 時發生錯誤: {e}")
        return False

def find_python_env(start_path=None, env_name="python-3.12.9"):
    # 尋找 python 執行環境
    if start_path is None:
        start_path = os.path.dirname(os.path.abspath(sys.argv[0]))
    current = start_path
    while True:
        if os.path.basename(current) == env_name:
            return current
        parent = os.path.dirname(current)
        if parent == current:
            raise FileNotFoundError(f"找不到執行環境 (資料夾名稱 {env_name})")
        current = parent

def clone_or_update_repo():
    # Clone 或更新 Repo

    from git import Repo, GitCommandError

    if os.path.exists(os.path.join(TARGET_DIR, ".git")):
        print(f"📦 偵測到現有專案，正在更新...\n路徑: {TARGET_DIR}")
        try:
            repo = Repo(TARGET_DIR)
            origin = repo.remotes.origin
            origin.fetch()
            local_commit = repo.head.commit.hexsha
            remote_commit = origin.refs[repo.active_branch.name].commit.hexsha
            if local_commit == remote_commit:
                print("✅ 專案已是最新版本。")
            else:
                print("⬇️  發現新版本，執行更新中...")
                origin.pull()
                print("✅ 更新完成！")
        except GitCommandError as e:
            print("❌ 更新過程發生錯誤：", e)
    else:
        print(f"🆕 未發現專案，開始 Clone...\n目標路徑: {TARGET_DIR}")
        try:
            Repo.clone_from(REPO_URL, TARGET_DIR)
            print("✅ Clone 完成！")
        except Exception as e:
            print("❌ Clone 失敗：", e)

def create_config():
    # 建立 repository 的 config
    # 內容為該專案所使用的 python 完整路徑
    # 專案的 root 完整路徑
    content = rf"""AUTHER=Rogers
PYTHON_EXE={find_python_env()}\python.exe
ROOT={TARGET_DIR}
"""
    with open(os.path.join(TARGET_DIR, "bat", "config.txt"), 'w', encoding='utf-8') as f:
        f.write(content)

def launch_main_program():
    """啟動主程式"""
    main_bat = os.path.join(TARGET_DIR, "bat", "cmd_launch.bat")
    if os.path.exists(main_bat):
        subprocess.Popen([main_bat], shell=True, cwd=TARGET_DIR)
    else:
        print("⚠️ 找不到主程式：", main_bat)

def main():
    if not check_git_installed(): # 檢查系統 PATH 中是否能找到 git 執行檔。
        print("您的系統未安裝 Git 或 Git 未加入系統 PATH。")
        msgbox("檢查 Git", "您的系統未安裝 Git")
        if _TK_ROOT:
            _TK_ROOT.quit()
        return # 未偵測到 Git 結束

    clone_or_update_repo() # 建立專案
    create_config()        # 建立專案的config
    launch_main_program()  # 啟動專案的啟動程序

if __name__ == "__main__":
    main()
