#!/usr/bin/env python3
"""
Goodbye CLI - 清空数据或卸载项目
========================================
合并为一个命令，通过参数控制行为：
  goodbye            - 清空所有数据（默认）
  goodbye --uninstall - 完全卸载项目
  goodbye --help     - 显示帮助信息
"""
import sys
import os
import shutil
import argparse
from pathlib import Path

# 项目根目录
PROJECT_ROOT = Path(__file__).parent.absolute()
DB_DIR = PROJECT_ROOT / "db"
DATA_DIR = PROJECT_ROOT / "data"
LOGS_DIR = PROJECT_ROOT / "logs"

def print_header(text):
    print("\n" + "=" * 60)
    print(f"  {text}")
    print("=" * 60)

def print_success(text):
    print(f"\033[92m✓ {text}\033[0m")

def print_warning(text):
    print(f"\033[93m⚠ {text}\033[0m")

def print_error(text):
    print(f"\033[91m✗ {text}\033[0m")

def confirm_action(prompt):
    response = input(f"{prompt} (yes/no): ").strip().lower()
    return response in ['yes', 'y']

def clean_database():
    print_header("清空数据库")
    db_files = list(DB_DIR.glob("*.db")) if DB_DIR.exists() else []
    
    if not db_files:
        print_warning("未找到数据库文件")
        return True
    
    print(f"找到 {len(db_files)} 个数据库文件:")
    for db_file in db_files:
        print(f"  - {db_file.name}")
    
    if confirm_action("确定要删除这些数据库文件吗？"):
        for db_file in db_files:
            try:
                db_file.unlink()
                print_success(f"已删除: {db_file.name}")
            except Exception as e:
                print_error(f"删除失败 {db_file.name}: {e}")
        return True
    else:
        print("操作已取消")
        return False

def clean_sessions():
    print_header("清空会话文件")
    session_files = []
    for pattern in ["sess_*", "web_*", "*_session*", "conversation_*"]:
        session_files.extend(PROJECT_ROOT.glob(pattern))
    
    if DATA_DIR.exists():
        for f in DATA_DIR.glob("*"):
            if f.is_file():
                session_files.append(f)
    
    session_files = list(set(session_files))
    
    if not session_files:
        print_warning("未找到会话文件")
        return True
    
    print(f"找到 {len(session_files)} 个会话相关文件/目录")
    
    if confirm_action("确定要删除这些会话文件吗？"):
        for f in session_files:
            try:
                if f.is_file():
                    f.unlink()
                    print_success(f"已删除文件: {f.name}")
                elif f.is_dir():
                    shutil.rmtree(f)
                    print_success(f"已删除目录: {f.name}")
            except Exception as e:
                print_error(f"删除失败 {f.name}: {e}")
        return True
    else:
        print("操作已取消")
        return False

def clean_logs():
    print_header("清空日志文件")
    if not LOGS_DIR.exists():
        print_warning("日志目录不存在")
        return True
    
    log_files = list(LOGS_DIR.glob("*.log")) + list(LOGS_DIR.glob("*.log.*"))
    
    if not log_files:
        print_warning("未找到日志文件")
        return True
    
    print(f"找到 {len(log_files)} 个日志文件")
    
    if confirm_action("确定要清空这些日志文件吗？"):
        for log_file in log_files:
            try:
                log_file.unlink()
                print_success(f"已删除: {log_file.name}")
            except Exception as e:
                print_error(f"删除失败 {log_file.name}: {e}")
        return True
    else:
        print("操作已取消")
        return False

def clean_all():
    print_header("清空所有数据")
    print_warning("此操作将删除：")
    print("  - 所有数据库文件")
    print("  - 所有会话文件")
    print("  - 所有日志文件")
    
    if not confirm_action("\n确定要清空所有数据吗？"):
        print("操作已取消")
        return False
    
    results = []
    results.append(clean_database())
    results.append(clean_sessions())
    results.append(clean_logs())
    
    if all(results):
        print_success("\n所有数据已清空！")
        return True
    else:
        print_error("\n部分数据清空失败")
        return False

def uninstall_project():
    print_header("卸载项目")
    print_warning("此操作将删除整个项目目录：")
    print(f"  {PROJECT_ROOT}")
    
    if not confirm_action("\n确定要完全卸载项目吗？此操作不可撤销！"):
        print("操作已取消")
        return False
    
    try:
        print("\n步骤 1: 清空数据...")
        clean_database()
        clean_sessions()
        clean_logs()
        
        print("\n步骤 2: 删除项目目录...")
        shutil.rmtree(PROJECT_ROOT)
        print_success(f"项目目录已删除: {PROJECT_ROOT}")
        print_success("项目已完全卸载！")
        return True
    except Exception as e:
        print_error(f"卸载失败: {e}")
        return False

def main():
    parser = argparse.ArgumentParser(
        prog="goodbye",
        description="Goodbye CLI - 清空数据或卸载项目",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例:
  goodbye             清空所有数据（默认）
  goodbye --uninstall 完全卸载项目
  goodbye --help     显示帮助信息
        """
    )
    
    parser.add_argument(
        "--uninstall",
        action="store_true",
        help="完全卸载项目（删除整个项目目录）"
    )
    
    parser.add_argument(
        "-y", "--yes",
        action="store_true",
        help="自动确认所有操作（非交互模式）"
    )
    
    args = parser.parse_args()
    
    # 检查是否在项目根目录
    if not (PROJECT_ROOT / "myagent").exists():
        print_error(f"错误: 未找到项目目录 {PROJECT_ROOT}")
        print("请确保在项目根目录下运行 goodbye 命令")
        sys.exit(1)
    
    # 执行命令
    if args.uninstall:
        if args.yes:
            print_error("安全提示：卸载操作不支持 -y 参数")
            sys.exit(1)
        uninstall_project()
    else:
        # 默认执行 clean
        if args.yes:
            clean_database()
            clean_sessions()
            clean_logs()
            print_success("所有数据已清空！")
        else:
            clean_all()

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n操作已取消")
        sys.exit(0)
    except Exception as e:
        print_error(f"执行失败: {e}")
        sys.exit(1)
