#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
TarjanOJ 测试环境清理工具
功能：
- 删除 Windows 凭据管理器中保存的 TarjanOJ 账号密码
- 删除计划任务 TarjanOJ_AutoCheckin
- 提示是否删除日志文件夹（可选）
"""

import sys
import os
import subprocess

# ----- 依赖检查 -----
try:
    import keyring
except ImportError:
    print("⏳ 正在安装 keyring ...")
    subprocess.check_call([sys.executable, "-m", "pip", "install", "keyring"])
    import keyring

SERVICE_NAME = "TarjanOJ"
TASK_NAME = "TarjanOJ_AutoCheckin"

def delete_credentials():
    """删除凭据管理器中的账密"""
    try:
        keyring.delete_password(SERVICE_NAME, "username")
        print("✅ 已删除用户名凭据")
    except keyring.errors.PasswordDeleteError:
        print("ℹ️ 用户名凭据不存在，跳过")
    except Exception as e:
        print(f"⚠️ 删除用户名凭据时出错: {e}")

    try:
        keyring.delete_password(SERVICE_NAME, "password")
        print("✅ 已删除密码凭据")
    except keyring.errors.PasswordDeleteError:
        print("ℹ️ 密码凭据不存在，跳过")
    except Exception as e:
        print(f"⚠️ 删除密码凭据时出错: {e}")

def delete_task():
    """删除计划任务"""
    try:
        # 移除 shell=True，使用列表
        result = subprocess.run(
            ["schtasks", "/delete", "/tn", TASK_NAME, "/f"],
            capture_output=True, text=True
        )
        if result.returncode == 0:
            print("✅ 已删除计划任务")
        else:
            stderr = result.stderr.lower()
            if "指定的任务名称不存在" in stderr or "the specified task name does not exist" in stderr:
                print("ℹ️ 计划任务不存在，跳过")
            else:
                print(f"⚠️ 删除计划任务失败: {result.stderr}")
    except Exception as e:
        print(f"⚠️ 删除计划任务时出错: {e}")

def delete_logs():
    """询问是否删除日志文件夹"""
    log_dir = r"C:\TarjanOJ\logs"
    if os.path.exists(log_dir):
        resp = input(f"是否删除日志文件夹 {log_dir}？(y/n): ").strip().lower()
        if resp == 'y':
            import shutil
            try:
                shutil.rmtree(log_dir)
                print(f"✅ 已删除日志文件夹 {log_dir}")
            except Exception as e:
                print(f"⚠️ 删除日志文件夹失败: {e}")
        else:
            print("ℹ️ 保留日志文件夹")
    else:
        print("ℹ️ 日志文件夹不存在，跳过")

def main():
    print("=" * 50)
    print("TarjanOJ 测试环境清理工具")
    print("=" * 50)

    # 检查管理员权限（删除任务需要）
    try:
        is_admin = os.getuid() == 0
    except AttributeError:
        import ctypes
        is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0

    if not is_admin:
        print("⚠️ 当前不是管理员模式，删除计划任务可能失败。")
        print("建议以管理员身份重新运行此脚本。")

    # ----- 菜单选择 -----
    print("\n请选择要执行的操作：")
    print("  1. 仅删除凭据（账密）")
    print("  2. 仅删除计划任务")
    print("  3. 全部删除（凭据 + 计划任务）")
    choice = input("请输入数字 (1/2/3): ").strip()

    if choice == '1':
        print("\n正在清理凭据管理器...")
        delete_credentials()
    elif choice == '2':
        print("\n正在清理计划任务...")
        delete_task()
    elif choice == '3':
        print("\n正在清理凭据管理器...")
        delete_credentials()
        print("\n正在清理计划任务...")
        delete_task()
    else:
        print("❌ 无效输入，请重新运行并选择 1、2 或 3。")
        sys.exit(1)

    # 额外询问是否删除日志（无论选择哪个）
    print("\n是否删除日志文件？")
    delete_logs()

    print("\n✅ 清理完成！")
    print("如需完全重置，您也可以手动删除脚本所在目录中的 'logs' 文件夹（如果存在）。")

if __name__ == "__main__":
    main()