#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
适用于无共享库Python环境的打包脚本
"""

import os
import sys
import shutil
import subprocess
from pathlib import Path
import argparse

def check_python_version():
    """检查Python版本"""
    if sys.version_info < (3, 8):
        print("错误: 需要Python 3.8或更高版本")
        sys.exit(1)
    print(f"[OK] Python版本: {sys.version}")

def check_dependencies():
    """检查必要的依赖"""
    try:
        import PyInstaller
        print(f"[OK] PyInstaller版本: {PyInstaller.__version__}")
    except ImportError:
        print("错误: 未安装PyInstaller")
        print("请运行: pip install pyinstaller")
        sys.exit(1)

def clean_build_dirs():
    """清理之前的构建目录"""
    dirs_to_clean = ['build', 'dist', '__pycache__']
    for dir_name in dirs_to_clean:
        if os.path.exists(dir_name):
            print(f"清理目录: {dir_name}")
            shutil.rmtree(dir_name)

    # 清理Python缓存文件
    for root, dirs, files in os.walk('.'):
        for file in files:
            if file.endswith('.pyc') or file.endswith('.pyo'):
                os.remove(os.path.join(root, file))
        if '__pycache__' in dirs:
            shutil.rmtree(os.path.join(root, '__pycache__'))

def run_pyinstaller_noshared():
    """运行PyInstaller进行打包（无共享库版本）"""
    print("开始打包（无共享库模式）...")

    # 尝试多种打包方式
    spec_files = ['build_noshared.spec', 'build.spec']

    for spec_file in spec_files:
        if os.path.exists(spec_file):
            print(f"使用规格文件: {spec_file}")

            # 构建命令
            cmd = ['pyinstaller', '--clean', '--noupx', spec_file]

            # 如果是build.spec，添加额外参数
            if spec_file == 'build.spec':
                cmd.extend(['--noupx', '--debug', 'imports'])

            try:
                result = subprocess.run(cmd, check=True, capture_output=True, text=True)
                print(f"[OK] PyInstaller执行成功 (使用 {spec_file})")
                if result.stdout:
                    print("输出:", result.stdout)
                return True
            except subprocess.CalledProcessError as e:
                print(f"使用 {spec_file} 打包失败: {e}")
                if e.stderr:
                    print("错误输出:", e.stderr)
                continue

    print("错误: 所有打包方式都失败了")
    return False

def create_simple_package():
    """创建简单的部署包（不使用PyInstaller）"""
    print("创建简单部署包...")

    deploy_dir = Path('deploy')
    if deploy_dir.exists():
        shutil.rmtree(deploy_dir)

    deploy_dir.mkdir()

    # 复制源代码
    shutil.copytree('app', deploy_dir / 'app')
    shutil.copy2('main.py', deploy_dir)
    shutil.copy2('requirements.txt', deploy_dir)
    shutil.copy2('.env.example', deploy_dir)

    # 创建启动脚本
    startup_script = '''#!/bin/bash
# 云盘后端服务启动脚本（Python模式）

# 进入脚本所在目录
cd "$(dirname "$0")"

# 检查Python环境
if ! command -v python3 &> /dev/null; then
    echo "错误: 未找到python3"
    exit 1
fi

# 检查虚拟环境
if [ ! -d "venv" ]; then
    echo "创建虚拟环境..."
    python3 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
else
    echo "激活虚拟环境..."
    source venv/bin/activate
fi

# 检查环境文件
if [ ! -f ".env" ]; then
    echo "警告: .env 文件不存在，将使用默认配置"
    if [ -f ".env.example" ]; then
        cp .env.example .env
        echo "已复制 .env.example 为 .env，请根据需要修改配置"
    fi
fi

# 启动服务
echo "启动云盘后端服务..."
python main.py
'''

    script_path = deploy_dir / 'start.sh'
    with open(script_path, 'w', encoding='utf-8') as f:
        f.write(startup_script)

    os.chmod(script_path, 0o755)

    # 创建安装脚本
    install_script = '''#!/bin/bash
# 简单安装脚本

INSTALL_DIR="$HOME/cloud-drive"

echo "=== 云盘后端服务安装（简单版本） ==="

# 创建安装目录
mkdir -p "$INSTALL_DIR"

# 复制文件
cp -r * "$INSTALL_DIR/"
cd "$INSTALL_DIR"

# 设置权限
chmod +x start.sh

echo "=== 安装完成 ==="
echo "进入目录: cd $INSTALL_DIR"
echo "启动服务: ./start.sh"
'''

    install_path = deploy_dir / 'install_simple.sh'
    with open(install_path, 'w', encoding='utf-8') as f:
        f.write(install_script)

    os.chmod(install_path, 0o755)

    print(f"[OK] 简单部署包创建完成: {deploy_dir.absolute()}")
    return True

def create_deployment_package():
    """创建部署包"""
    dist_dir = Path('dist')
    deploy_dir = Path('deploy')

    if deploy_dir.exists():
        shutil.rmtree(deploy_dir)

    deploy_dir.mkdir()

    # 尝试复制可执行文件
    exe_file = dist_dir / 'cloud-drive-server'
    if exe_file.exists():
        shutil.copy2(exe_file, deploy_dir)
        print(f"[OK] 复制可执行文件到 {deploy_dir}")
        return True
    else:
        print("警告: 未找到可执行文件，创建简单部署包")
        return create_simple_package()

def main():
    """主函数"""
    parser = argparse.ArgumentParser(description='云盘后端Linux打包工具（无共享库版）')
    parser.add_argument('--clean', action='store_true', help='仅清理构建目录')
    parser.add_argument('--no-clean', action='store_true', help='跳过清理步骤')
    parser.add_argument('--simple', action='store_true', help='创建简单部署包（不使用PyInstaller）')

    args = parser.parse_args()

    print("=== 云盘后端Linux打包工具（无共享库版） ===")
    print(f"当前目录: {os.getcwd()}")

    # 检查环境
    check_python_version()
    check_dependencies()

    # 清理构建目录
    if args.clean:
        clean_build_dirs()
        print("[OK] 清理完成")
        return

    if not args.no_clean:
        clean_build_dirs()

    if args.simple:
        # 直接创建简单部署包
        create_simple_package()
    else:
        # 尝试PyInstaller打包
        if run_pyinstaller_noshared():
            create_deployment_package()
        else:
            print("PyInstaller打包失败，创建简单部署包...")
            create_simple_package()

    print("\n=== 打包完成 ===")
    print("部署包位置: ./deploy/")

    # 检查部署包内容
    deploy_dir = Path('deploy')
    if (deploy_dir / 'cloud-drive-server').exists():
        print("✓ 可执行文件: cloud-drive-server")
        print("运行方式: ./cloud-drive-server")
    else:
        print("✓ Python源代码包")
        print("运行方式: ./start.sh")
        print("安装方式: ./install_simple.sh")

if __name__ == '__main__':
    main()