#!/bin/bash

# 颜色定义
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
BLUE='\033[34m'
RESET='\033[0m'

# 日志函数（增加当前目录显示）
log() {
    local level=$1
    local msg=$2
    local current_dir="[$(basename $(pwd))]"  # 显示当前目录短名称
    case $level in
        INFO)    echo -e "${BLUE}[INFO]${RESET} ${current_dir} $msg" ;;
        SUCCESS) echo -e "${GREEN}[SUCCESS]${RESET} ${current_dir} $msg" ;;
        ERROR)   echo -e "${RED}[ERROR]${RESET} ${current_dir} $msg" ;;
        WARNING) echo -e "${YELLOW}[WARNING]${RESET} ${current_dir} $msg" ;;
    esac
}

# 检查是否为 root 用户
if [ "$(id -u)" -ne 0 ]; then
    log ERROR "此脚本需要 root 权限执行"
    exit 1
fi

# 初始化部署状态
DEPLOY_STATUS=0
FAILED_STEPS=()

# 前置检查和安装
log INFO "开始前置检查和安装"

# 检查系统并配置镜像源
if grep -q "CentOS Stream release 8" /etc/redhat-release; then
    log INFO "检测到 CentOS Stream 8，配置阿里云镜像源"
    bash CentOS_Stream8.sh
    if [ $? -ne 0 ]; then
        DEPLOY_STATUS=1
        FAILED_STEPS+=("配置阿里云镜像源")
    fi
fi

# 升级 OpenSSL（如果版本不足）
OPENSSL_CURRENT=$(openssl version | awk '{print $2}' | cut -d '-' -f1)
if printf '%s\n' "1.1.1" "$OPENSSL_CURRENT" | sort -V | head -n1 | grep -q "^1.1.1$"; then
    log INFO "OpenSSL 版本符合要求 (≥1.1.1)"
else
    log INFO "OpenSSL 版本不足，执行升级"
    bash upgrade_openssl_1.1.1.sh
    if [ $? -ne 0 ]; then
        DEPLOY_STATUS=1
        FAILED_STEPS+=("升级 OpenSSL")
    fi
fi

# 检查端口并安装基础工具
log INFO "检查 80 端口并安装基础工具"
bash check_allow_port80.sh
if [ $? -ne 0 ]; then
    DEPLOY_STATUS=1
    FAILED_STEPS+=("检查 80 端口")
fi
yum install -y dos2unix wget pv
if [ $? -ne 0 ]; then
    DEPLOY_STATUS=1
    FAILED_STEPS+=("安装基础工具")
fi

# 1. 安装数据库
log INFO "开始安装 MySQL 8"
bash install_mysql8_6th.sh
if [ $? -ne 0 ]; then
    DEPLOY_STATUS=1
    FAILED_STEPS+=("安装 MySQL 8")
fi

# 2. 安装 Redis
log INFO "开始安装 Redis"
bash install_redis.sh
if [ $? -ne 0 ]; then
    DEPLOY_STATUS=1
    FAILED_STEPS+=("安装 Redis")
fi

# 3. 安装 Python
log INFO "开始安装 Python 3.9.5"
bash install_python.sh
if [ $? -ne 0 ]; then
    DEPLOY_STATUS=1
    FAILED_STEPS+=("安装 Python 3.9.5")
fi



# 4. 创建并激活虚拟环境（明确显示环境名称）
log INFO "创建虚拟环境"
PROJECT_NAME=$(python3 -c "from makemigrations_migrate_collectstatic import get_project_name; print(get_project_name())")
VENV_DIR="/envs/${PROJECT_NAME}"
VENV_PATH="${VENV_DIR}/bin/activate"

# 创建虚拟环境（假设 create_venv.sh 生成环境到指定目录）
log INFO "创建虚拟环境到 ${VENV_DIR}"
bash create_venv.sh "${PROJECT_NAME}"
if [ $? -ne 0 ]; then
    DEPLOY_STATUS=1
    FAILED_STEPS+=("创建虚拟环境")
fi

# 激活虚拟环境（显示激活状态）
log INFO "激活虚拟环境 ${PROJECT_NAME}"
source "${VENV_PATH}"
if [ $? -ne 0 ]; then
    DEPLOY_STATUS=1
    FAILED_STEPS+=("激活虚拟环境")
fi
# 显示虚拟环境激活后的提示符（模拟终端提示）
echo -e "${GREEN}(${PROJECT_NAME})${RESET} $(basename $(pwd))# "  # 显示环境名称前缀

# 5. 生成 local_settings.py（假设已包含数据库配置）
log INFO "生成项目配置文件"
python3 generate_local_settings.py
if [ $? -ne 0 ]; then
    DEPLOY_STATUS=1
    FAILED_STEPS+=("生成项目配置文件")
fi

# 6. 安装依赖（使用你的Python安装脚本）
log INFO "开始安装依赖（带智能版本处理）"
python3 install_requirements.py
if [ $? -ne 0 ]; then
    DEPLOY_STATUS=1
    FAILED_STEPS+=("安装依赖")
fi

# 7. 执行 makemigrations_migrate_collectstatic.py 脚本（核心修正点）
log INFO "通过 makemigrations_migrate_collectstatic.py 执行部署操作"
python3 makemigrations_migrate_collectstatic.py
if [ $? -ne 0 ]; then
    DEPLOY_STATUS=1
    FAILED_STEPS+=("执行 makemigrations_migrate_collectstatic.py 脚本")
fi

# 8. 生成并执行 uWSGI 脚本（路径修正为项目根目录）
log INFO "生成 uWSGI 配置"
python3 generate_uwsgi.py || {
    log ERROR "uWSGI 配置生成失败"
    DEPLOY_STATUS=1
}

# 获取项目根目录（与 generate_uwsgi.py 一致）
PROJECT_ROOT="/www/wwwroot/${PROJECT_NAME}"
UWSGI_RESTART_SCRIPT="${PROJECT_ROOT}/uwsgi_${PROJECT_NAME}_restart.sh"  # 关键修正：路径在项目根目录

log INFO "重启 uWSGI 服务"
bash "${UWSGI_RESTART_SCRIPT}" || {
    log ERROR "uWSGI 重启脚本执行失败"
    DEPLOY_STATUS=1
}

# 9. 安装 Nginx（在系统环境中执行）
log INFO "安装 Nginx 并配置"
python3 install_nginx.py
if [ $? -ne 0 ]; then
    DEPLOY_STATUS=1
    FAILED_STEPS+=("安装 Nginx 并配置")
fi

# 部署总结
if [ $DEPLOY_STATUS -eq 0 ]; then
    log SUCCESS "=== Django 项目部署成功 ==="
    echo -e "${GREEN}虚拟环境路径:${RESET} ${VENV_DIR}"
    echo -e "${GREEN}项目目录:${RESET} /www/wwwroot/${PROJECT_NAME}"
else
    log ERROR "=== 部署失败，存在 ${RED}$DEPLOY_STATUS${RESET} 个错误 ==="
    log WARNING "以下步骤执行失败，请检查："
    for step in "${FAILED_STEPS[@]}"; do
        echo -e "${RED}- $step${RESET}"
    done
fi

# 保持窗口打开
read -p "按任意键退出..."