#!/bin/bash

# MySQL数据库备份脚本 - 双模式版本
# 用法: 
#   单文件模式: ./backup_all_databases.sh <host> <port> <user> <password> single
#   独立文件模式: ./backup_all_databases.sh <host> <port> <user> <password> separate

# 检查参数数量
if [ $# -lt 4 ] || [ $# -gt 5 ]; then
    echo "用法: $0 <host> <port> <user> <password> [mode]"
    echo "  mode: single     - 导出所有数据库到单个文件 (dump/all.sql)"
    echo "        separate   - 每个数据库导出为独立文件 (dump/dbname.sql)"
    echo "  默认: separate"
    echo "示例:"
    echo "  $0 localhost 3306 root password single"
    echo "  $0 localhost 3306 root password separate"
    exit 1
fi

# 接收参数
HOST="$1"
PORT="$2"
USER="$3"
PASSWORD="$4"
MODE="${5:-separate}"  # 默认使用独立文件模式

# 设置导出目录
DUMP_DIR="dump"
SINGLE_FILE="$DUMP_DIR/all.sql"

# MySQL系统数据库列表（需要排除的）
EXCLUDED_DBS=(
    "information_schema"
    "performance_schema"
    "mysql"
    "sys"
)

# 创建导出目录
create_dump_dir() {
    if [ ! -d "$DUMP_DIR" ]; then
        mkdir -p "$DUMP_DIR"
        echo "创建目录: $DUMP_DIR"
    fi
}

# 检查MySQL连接
check_connection() {
    echo "检查MySQL连接..."
    mysql -h"$HOST" -P"$PORT" -u"$USER" -p"$PASSWORD" -e "SELECT 1" &>/dev/null
    if [ $? -ne 0 ]; then
        echo "错误: 无法连接到MySQL服务器，请检查连接参数"
        exit 1
    fi
    echo "MySQL连接成功"
}

# 获取数据库列表
get_databases() {
    echo "获取数据库列表..."
    ALL_DBS=$(mysql -h"$HOST" -P"$PORT" -u"$USER" -p"$PASSWORD" -e "SHOW DATABASES;" -s -N)
    
    DB_ARRAY=()
    for db in $ALL_DBS; do
        excluded=0
        for excluded_db in "${EXCLUDED_DBS[@]}"; do
            if [ "$db" = "$excluded_db" ]; then
                excluded=1
                break
            fi
        done
        
        if [ $excluded -eq 0 ]; then
            DB_ARRAY+=("$db")
        fi
    done
    
    if [ ${#DB_ARRAY[@]} -eq 0 ]; then
        echo "警告: 没有找到用户数据库"
        return 1
    fi
    
    echo "找到 ${#DB_ARRAY[@]} 个数据库:"
    printf "  %s\n" "${DB_ARRAY[@]}"
    return 0
}

# 导出为独立文件
export_separate() {
    echo "模式: 独立文件导出"
    echo "========================================="
    
    SUCCESS_COUNT=0
    FAIL_COUNT=0
    
    for db in "${DB_ARRAY[@]}"; do
        local output_file="$DUMP_DIR/${db}.sql"
        echo "正在导出: $db -> $output_file"
        
        mysqldump -h"$HOST" -P"$PORT" -u"$USER" -p"$PASSWORD" \
            --single-transaction \
            --routines \
            --triggers \
            --events \
            --add-drop-database \
            --databases "$db" > "$output_file" 2>/dev/null
        
        if [ $? -eq 0 ]; then
            echo "  ✓ 成功"
            ((SUCCESS_COUNT++))
        else
            echo "  ✗ 失败"
            ((FAIL_COUNT++))
        fi
    done
    
    echo "========================================="
    echo "独立文件导出完成!"
    echo "成功: $SUCCESS_COUNT, 失败: $FAIL_COUNT"
    
    if [ $SUCCESS_COUNT -gt 0 ]; then
        echo ""
        echo "备份文件列表:"
        ls -lh "$DUMP_DIR"/*.sql 2>/dev/null | awk '{print "  " $9 " (" $5 ")"}'
    fi
}

# 导出为单个文件
export_single() {
    echo "模式: 单文件导出"
    echo "========================================="
    echo "导出所有数据库到: $SINGLE_FILE"
    
    # 构建数据库参数
    local db_param=""
    for db in "${DB_ARRAY[@]}"; do
        db_param="$db_param $db"
    done
    
    mysqldump -h"$HOST" -P"$PORT" -u"$USER" -p"$PASSWORD" \
        --single-transaction \
        --routines \
        --triggers \
        --events \
        --add-drop-database \
        --databases $db_param > "$SINGLE_FILE" 2>/dev/null
    
    if [ $? -eq 0 ]; then
        file_size=$(du -h "$SINGLE_FILE" | cut -f1)
        echo "✓ 导出成功!"
        echo "  文件大小: $file_size"
        echo "  文件位置: $(pwd)/$SINGLE_FILE"
        
        # 显示包含的数据库列表
        echo ""
        echo "包含的数据库:"
        for db in "${DB_ARRAY[@]}"; do
            echo "  - $db"
        done
        return 0
    else
        echo "✗ 导出失败!"
        return 1
    fi
}

# 主函数
main() {
    echo "========================================="
    echo "MySQL数据库备份工具"
    echo "========================================="
    echo "主机: $HOST:$PORT"
    echo "用户: $USER"
    echo "模式: $MODE"
    echo "========================================="
    
    create_dump_dir
    check_connection
    
    if ! get_databases; then
        exit 1
    fi
    
    echo ""
    
    case "$MODE" in
        single)
            export_single
            ;;
        separate)
            export_separate
            ;;
        *)
            echo "错误: 未知模式 '$MODE'"
            echo "支持的模式: single, separate"
            exit 1
            ;;
    esac
}

main
