#!/bin/bash
# ================================================================================
# Mall SQL 自动部署脚本
# ================================================================================
# 用途：自动执行商城数据库脚本
# 使用：./deploy.sh [选项]
#
# 选项：
#   --full          完整部署（删除重建）
#   --upgrade       增量升级
#   --check         仅检查数据库状态
#   --test          创建测试数据
#   --help          显示帮助
# ================================================================================

set -e  # 遇到错误立即退出

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

# 默认配置
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
DB_NAME="${DB_NAME:-akmon}"
DB_USER="${DB_USER:-postgres}"
SCHEMA_DIR="schemas"
MIGRATION_DIR="migrations"
TEST_DIR="tests"
SUBSCRIPTION_DIR="subscription"

# 日志函数
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"
}

# 显示帮助
show_help() {
    cat << EOF
Mall SQL 自动部署脚本

用法: $0 [选项]

选项:
  --full          完整部署（删除重建数据库）
  --upgrade       增量升级（保留现有数据）
  --check         检查数据库状态
  --test          创建测试数据
  --subscription  部署订阅系统
  --help          显示此帮助信息

环境变量:
  DB_HOST         数据库主机 (默认: localhost)
  DB_PORT         数据库端口 (默认: 5432)
  DB_NAME         数据库名称 (默认: akmon)
  DB_USER         数据库用户 (默认: postgres)

示例:
  # 完整部署
  $0 --full

  # 增量升级
  $0 --upgrade

  # 检查状态
  $0 --check

  # 使用自定义数据库
  DB_HOST=prod.example.com DB_NAME=akmon_prod $0 --upgrade
EOF
}

# 检查数据库连接
check_connection() {
    log_info "检查数据库连接..."

    if psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c '\q' 2>/dev/null; then
        log_success "数据库连接成功"
        return 0
    else
        log_error "无法连接到数据库: $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME"
        return 1
    fi
}

# 执行SQL文件
execute_sql() {
    local sql_file=$1
    local description=$2

    log_info "执行: $description"

    if [ ! -f "$sql_file" ]; then
        log_error "文件不存在: $sql_file"
        return 1
    fi

    if psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -f "$sql_file"; then
        log_success "完成: $description"
        return 0
    else
        log_error "失败: $description"
        return 1
    fi
}

# 检查数据库状态
check_database() {
    log_info "检查数据库状态..."
    execute_sql "$TEST_DIR/mall_database_check.sql" "数据库状态检查"
}

# 完整部署
deploy_full() {
    log_warning "=========================================="
    log_warning "完整部署将重建所有商城表！"
    log_warning "=========================================="
    read -p "确认继续? (yes/no): " confirm

    if [ "$confirm" != "yes" ]; then
        log_info "已取消"
        return 0
    fi

    log_info "开始完整部署..."

    # 1. 完整数据库
    execute_sql "$SCHEMA_DIR/complete_mall_database.sql" "创建商城核心表"

    # 2. 商品表补充
    execute_sql "$SCHEMA_DIR/product_database.sql" "创建商品补充表"

    # 3. SEO和安全
    execute_sql "$SCHEMA_DIR/mall_seo_security.sql" "配置SEO和安全策略"

    # 4. 订阅系统
    execute_sql "$SUBSCRIPTION_DIR/create_mall_subscription_tables.sql" "创建订阅表"
    execute_sql "$SUBSCRIPTION_DIR/subscription_guard_trigger.sql" "创建订阅触发器"
    execute_sql "$SUBSCRIPTION_DIR/subscription_rls_policies.sql" "创建订阅RLS策略"

    log_success "完整部署完成！"
    log_info "接下来可以运行: $0 --test"
}

# 增量升级
deploy_upgrade() {
    log_info "开始增量升级..."

    # 1. 先检查
    check_database

    # 2. 执行升级
    execute_sql "$MIGRATION_DIR/mall_alter_upgrade.sql" "增量升级"

    # 3. 验证
    execute_sql "$TEST_DIR/validation_test.sql" "数据完整性验证"

    log_success "增量升级完成！"
}

# 创建测试数据
create_test_data() {
    log_info "创建测试数据..."

    # 1. 先创建Auth用户
    execute_sql "$TEST_DIR/create_supabase_auth_users.sql" "创建测试用户"

    # 2. 创建模拟数据
    execute_sql "$TEST_DIR/mock_data_insert.sql" "创建模拟数据"

    # 3. 验证
    execute_sql "$TEST_DIR/verify_mock_data_fix.sql" "验证测试数据"

    log_success "测试数据创建完成！"
}

# 部署订阅系统
deploy_subscription() {
    log_info "部署订阅系统..."

    execute_sql "$SUBSCRIPTION_DIR/create_mall_subscription_tables.sql" "创建订阅表"
    execute_sql "$SUBSCRIPTION_DIR/subscription_guard_trigger.sql" "创建订阅触发器"
    execute_sql "$SUBSCRIPTION_DIR/subscription_rls_policies.sql" "创建订阅RLS策略"

    log_success "订阅系统部署完成！"
}

# 主函数
main() {
    echo "=========================================="
    echo "     Mall SQL 自动部署脚本"
    echo "=========================================="
    echo "数据库: $DB_USER@$DB_HOST:$DB_PORT/$DB_NAME"
    echo "=========================================="
    echo ""

    # 检查连接
    if ! check_connection; then
        exit 1
    fi

    # 解析参数
    case "${1:-}" in
        --full)
            deploy_full
            ;;
        --upgrade)
            deploy_upgrade
            ;;
        --check)
            check_database
            ;;
        --test)
            create_test_data
            ;;
        --subscription)
            deploy_subscription
            ;;
        --help|-h)
            show_help
            ;;
        *)
            log_error "未知选项: ${1:-}"
            echo ""
            show_help
            exit 1
            ;;
    esac
}

# 运行主函数
main "$@"
