#!/usr/bin/env python3
"""
云盘应用打包脚本
用于将FastAPI应用打包为可执行文件
"""

import os
import sys
import shutil
from pathlib import Path

def clean_build():
    """清理之前的构建文件"""
    print("清理之前的构建文件...")

    # 清理PyInstaller生成的文件
    dirs_to_clean = ['build', 'dist', '__pycache__']
    for dir_name in dirs_to_clean:
        if os.path.exists(dir_name):
            shutil.rmtree(dir_name)
            print(f"  ✅ 已删除: {dir_name}")

    # 清理.spec文件
    if os.path.exists('main.spec'):
        os.remove('main.spec')
        print(f"  ✅ 已删除: main.spec")

def check_dependencies():
    """检查依赖是否安装"""
    print("📦 检查依赖...")

    required_packages = ['fastapi', 'uvicorn', 'pydantic', 'sqlalchemy', 'loguru']
    missing_packages = []

    for package in required_packages:
        try:
            __import__(package)
            print(f"  ✅ {package}")
        except ImportError:
            missing_packages.append(package)
            print(f"  ❌ {package} (缺失)")

    if missing_packages:
        print(f"\n❌ 缺少以下依赖: {', '.join(missing_packages)}")
        print("请运行: pip install -r requirements.txt")
        return False

    print("✅ 所有依赖都已安装")
    return True

def build_executable():
    """构建可执行文件"""
    print("🔨 开始构建可执行文件...")

    # 使用自定义的spec文件进行构建
    import subprocess
    result = subprocess.run([
        sys.executable, '-m', 'PyInstaller',
        'build.spec',
        '--clean',
        '--noconfirm'
    ], capture_output=True, text=True)

    if result.returncode == 0:
        print("✅ 构建成功!")
        print(f"📁 可执行文件位置: {os.path.abspath('dist/cloud-drive-server.exe')}")
        return True
    else:
        print("❌ 构建失败!")
        print("错误信息:")
        print(result.stderr)
        return False

def create_deployment_package():
    """创建部署包"""
    print("📦 创建部署包...")

    dist_dir = Path('dist')
    deploy_dir = Path('deploy')

    # 创建部署目录
    if deploy_dir.exists():
        shutil.rmtree(deploy_dir)
    deploy_dir.mkdir()

    # 复制可执行文件
    exe_path = dist_dir / 'cloud-drive-server.exe'
    if exe_path.exists():
        shutil.copy2(exe_path, deploy_dir / 'cloud-drive-server.exe')
        print("  ✅ 复制可执行文件")

    # 复制配置文件
    config_files = ['requirements.txt', '.env.example']
    for config_file in config_files:
        if os.path.exists(config_file):
            shutil.copy2(config_file, deploy_dir / config_file)
            print(f"  ✅ 复制配置文件: {config_file}")

    # 创建启动脚本
    start_script = deploy_dir / 'start.bat'
    with open(start_script, 'w', encoding='utf-8') as f:
        f.write("""@echo off
echo 🚀 启动云盘服务器...
echo 📝 确保MySQL和Redis服务已启动
echo.
cloud-drive-server.exe
pause
""")
    print("  ✅ 创建启动脚本: start.bat")

    # 创建README
    readme_path = deploy_dir / 'README.md'
    with open(readme_path, 'w', encoding='utf-8') as f:
        f.write("""# 云盘应用部署包

## 快速启动

1. **确保数据库和缓存服务运行**
   - MySQL服务器已启动
   - Redis服务器已启动（可选）

2. **配置环境变量**
   - 复制 `.env.example` 为 `.env`
   - 修改 `.env` 中的数据库连接信息

3. **启动应用**
   - Windows: 双击 `start.bat` 或运行 `cloud-drive-server.exe`
   - 访问 http://localhost:8000

## 配置说明

在 `.env` 文件中配置以下参数:

```env
# 数据库配置
DATABASE_URL=mysql+pymysql://username:password@localhost:3306/database_name

# JWT密钥
SECRET_KEY=your-secret-key-here

# 其他配置...
```

## API文档

启动后访问:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc

## 故障排除

1. **端口被占用**: 修改 `.env` 中的 `PORT` 配置
2. **数据库连接失败**: 检查MySQL服务状态和连接配置
3. **缺少依赖**: 确保所有依赖已正确安装
""")
    print("  ✅ 创建README文档")

    print(f"📁 部署包位置: {deploy_dir.absolute()}")
    return True

def main():
    """主函数"""
    print("🏗️  云盘应用打包工具")
    print("=" * 50)

    # 1. 检查依赖
    if not check_dependencies():
        sys.exit(1)

    # 2. 清理之前的构建
    clean_build()

    # 3. 构建可执行文件
    if not build_executable():
        sys.exit(1)

    # 4. 创建部署包
    if not create_deployment_package():
        sys.exit(1)

    print("\n🎉 打包完成!")
    print("📁 部署包位于 'deploy' 目录")
    print("🚀 可以将整个 deploy 文件夹复制到目标服务器运行")

if __name__ == "__main__":
    main()