#!/bin/bash

# 环境设置脚本
# 用于初始化Docker部署环境和配置文件

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查必要的命令
check_requirements() {
    log_info "检查系统要求..."
    
    if ! command -v docker &> /dev/null; then
        log_error "Docker 未安装，请先安装 Docker"
        exit 1
    fi
    
    if ! command -v docker-compose &> /dev/null; then
        log_error "Docker Compose 未安装，请先安装 Docker Compose"
        exit 1
    fi
    
    log_success "系统要求检查通过"
}

# 创建必要的目录
create_directories() {
    log_info "创建必要的目录结构..."
    
    # 数据目录
    mkdir -p data/{mysql,logs,configs}
    mkdir -p data/{dev,staging,prod}/{mysql,logs,configs}
    
    # 日志目录
    mkdir -p logs/{dev,staging,prod}
    
    log_success "目录结构创建完成"
}

# 设置环境配置
setup_environment() {
    local env=${1:-development}
    
    log_info "设置 ${env} 环境配置..."
    
    # 检查环境配置文件是否存在
    if [[ ! -f "environments/.env.${env}" ]]; then
        log_error "环境配置文件 .env.${env} 不存在"
        exit 1
    fi
    
    # 复制环境配置文件
    cp "environments/.env.${env}" .env
    
    # 复制Docker Compose配置
    cp docker-compose.yml.template docker-compose.yml
    
    # 复制配置文件模板
    cp configs/nginx.conf.template configs/nginx.conf
    cp configs/application-docker.yml.template configs/application-docker.yml
    cp configs/my.cnf.template configs/my.cnf
    
    log_success "${env} 环境配置设置完成"
}

# 设置文件权限
set_permissions() {
    log_info "设置文件权限..."
    
    # 设置脚本执行权限
    chmod +x scripts/*.sh
    
    # 设置数据目录权限
    chmod -R 755 data/
    chmod -R 755 logs/
    
    log_success "文件权限设置完成"
}

# 验证配置
validate_config() {
    log_info "验证配置文件..."
    
    # 检查 .env 文件
    if [[ ! -f ".env" ]]; then
        log_error ".env 文件不存在，请先运行环境设置"
        exit 1
    fi
    
    # 检查 docker-compose.yml 文件
    if [[ ! -f "docker-compose.yml" ]]; then
        log_error "docker-compose.yml 文件不存在"
        exit 1
    fi
    
    # 验证 Docker Compose 配置语法
    if ! docker-compose config > /dev/null 2>&1; then
        log_error "Docker Compose 配置文件语法错误"
        exit 1
    fi
    
    log_success "配置文件验证通过"
}

# 显示帮助信息
show_help() {
    echo "用法: $0 [选项] [环境]"
    echo ""
    echo "选项:"
    echo "  -h, --help     显示此帮助信息"
    echo "  -c, --check    仅检查系统要求"
    echo "  -v, --validate 仅验证配置"
    echo ""
    echo "环境:"
    echo "  development    开发环境 (默认)"
    echo "  staging        测试环境"
    echo "  production     生产环境"
    echo ""
    echo "示例:"
    echo "  $0                    # 设置开发环境"
    echo "  $0 production         # 设置生产环境"
    echo "  $0 --check            # 仅检查系统要求"
}

# 主函数
main() {
    local environment="development"
    local check_only=false
    local validate_only=false
    
    # 解析命令行参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -c|--check)
                check_only=true
                shift
                ;;
            -v|--validate)
                validate_only=true
                shift
                ;;
            development|staging|production)
                environment=$1
                shift
                ;;
            *)
                log_error "未知参数: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    # 切换到docker目录
    cd "$(dirname "$0")/.."
    
    log_info "开始设置Docker部署环境..."
    
    # 检查系统要求
    check_requirements
    
    if [[ "$check_only" == true ]]; then
        log_success "系统要求检查完成"
        exit 0
    fi
    
    if [[ "$validate_only" == true ]]; then
        validate_config
        log_success "配置验证完成"
        exit 0
    fi
    
    # 创建目录结构
    create_directories
    
    # 设置环境配置
    setup_environment "$environment"
    
    # 设置文件权限
    set_permissions
    
    # 验证配置
    validate_config
    
    log_success "Docker部署环境设置完成！"
    log_info "下一步："
    log_info "1. 检查并修改 .env 文件中的配置"
    log_info "2. 运行 'scripts/build.sh' 构建镜像"
    log_info "3. 运行 'scripts/deploy.sh start' 启动服务"
}

# 执行主函数
main "$@"