#!/bin/bash

# 数据库管理脚本
# 用于管理MySQL数据库容器的启动、停止、备份等操作

set -e

# 脚本配置
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
COMPOSE_FILE="$SCRIPT_DIR/docker-compose.database.yml"
ENV_FILE="$SCRIPT_DIR/.env.database"

# 颜色定义
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_env_file() {
    if [ ! -f "$ENV_FILE" ]; then
        log_warning "环境文件不存在: $ENV_FILE"
        log_info "从模板创建环境文件..."
        cp "$ENV_FILE.template" "$ENV_FILE"
        log_success "环境文件已创建，请根据需要修改配置"
    fi
}

# 创建必要的目录
create_directories() {
    local data_dir="$SCRIPT_DIR/data"
    local mysql_dir="$data_dir/mysql"
    local logs_dir="$data_dir/logs/mysql"
    
    log_info "创建数据目录..."
    mkdir -p "$mysql_dir" "$logs_dir"
    
    # 设置权限（MySQL需要特定的权限）
    chmod 755 "$mysql_dir" "$logs_dir"
    
    log_success "数据目录创建完成"
}

# 启动数据库
start_database() {
    log_info "启动MySQL数据库容器..."
    
    check_env_file
    create_directories
    
    # 使用docker-compose启动
    docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" up -d
    
    log_success "数据库容器启动完成"
    log_info "等待数据库初始化..."
    
    # 等待健康检查通过
    local max_attempts=30
    local attempt=1
    
    while [ $attempt -le $max_attempts ]; do
        if docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" ps | grep -q "healthy"; then
            log_success "数据库已就绪"
            return 0
        fi
        
        log_info "等待数据库启动... ($attempt/$max_attempts)"
        sleep 10
        ((attempt++))
    done
    
    log_error "数据库启动超时"
    return 1
}

# 停止数据库
stop_database() {
    log_info "停止MySQL数据库容器..."
    
    docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" down
    
    log_success "数据库容器已停止"
}

# 重启数据库
restart_database() {
    log_info "重启MySQL数据库容器..."
    
    stop_database
    start_database
}

# 查看数据库状态
status_database() {
    log_info "数据库容器状态:"
    docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" ps
}

# 查看数据库日志
logs_database() {
    local lines=${1:-100}
    log_info "显示数据库日志 (最近 $lines 行):"
    docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" logs --tail="$lines" -f
}

# 进入数据库容器
exec_database() {
    log_info "进入数据库容器..."
    docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec anxin-mysql bash
}

# 连接到MySQL
connect_mysql() {
    log_info "连接到MySQL数据库..."
    
    # 从环境文件读取配置
    source "$ENV_FILE"
    
    docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec anxin-mysql \
        mysql -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME"
}

# 备份数据库
backup_database() {
    local backup_file="$SCRIPT_DIR/backup/anxin_$(date +%Y%m%d_%H%M%S).sql"
    local backup_dir="$(dirname "$backup_file")"
    
    log_info "备份数据库到: $backup_file"
    
    # 创建备份目录
    mkdir -p "$backup_dir"
    
    # 从环境文件读取配置
    source "$ENV_FILE"
    
    # 执行备份
    docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec -T anxin-mysql \
        mysqldump -u"$DB_USER" -p"$DB_PASSWORD" --single-transaction --routines --triggers "$DB_NAME" > "$backup_file"
    
    log_success "数据库备份完成: $backup_file"
}

# 恢复数据库
restore_database() {
    local backup_file="$1"
    
    if [ -z "$backup_file" ] || [ ! -f "$backup_file" ]; then
        log_error "请指定有效的备份文件"
        return 1
    fi
    
    log_info "从备份文件恢复数据库: $backup_file"
    
    # 从环境文件读取配置
    source "$ENV_FILE"
    
    # 执行恢复
    docker-compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec -T anxin-mysql \
        mysql -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < "$backup_file"
    
    log_success "数据库恢复完成"
}

# 显示帮助信息
show_help() {
    echo "数据库管理脚本"
    echo ""
    echo "用法: $0 [命令] [参数]"
    echo ""
    echo "命令:"
    echo "  start           启动数据库容器"
    echo "  stop            停止数据库容器"
    echo "  restart         重启数据库容器"
    echo "  status          查看数据库容器状态"
    echo "  logs [lines]    查看数据库日志 (默认100行)"
    echo "  exec            进入数据库容器"
    echo "  connect         连接到MySQL数据库"
    echo "  backup          备份数据库"
    echo "  restore <file>  从备份文件恢复数据库"
    echo "  help            显示此帮助信息"
    echo ""
    echo "示例:"
    echo "  $0 start                    # 启动数据库"
    echo "  $0 logs 50                  # 查看最近50行日志"
    echo "  $0 restore backup.sql       # 从backup.sql恢复数据库"
}

# 主函数
main() {
    case "${1:-help}" in
        start)
            start_database
            ;;
        stop)
            stop_database
            ;;
        restart)
            restart_database
            ;;
        status)
            status_database
            ;;
        logs)
            logs_database "$2"
            ;;
        exec)
            exec_database
            ;;
        connect)
            connect_mysql
            ;;
        backup)
            backup_database
            ;;
        restore)
            restore_database "$2"
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            log_error "未知命令: $1"
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"