#!/bin/bash

# ============================================
# 数据库重建脚本
# 删除所有表并重新初始化
# ============================================

set -e

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

# 数据库配置（根据实际情况修改）
DB_HOST=${DB_HOST:-localhost}
DB_PORT=${DB_PORT:-5432}
DB_NAME=${DB_NAME:-lingyue_zhibao}
DB_USER=${DB_USER:-postgres}

log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_title() { echo -e "\n${BLUE}========== $1 ==========${NC}\n"; }

# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SQL_DIR="${SCRIPT_DIR}"

# 检查 SQL 文件是否存在
check_sql_files() {
    log_title "检查 SQL 文件"
    
    local missing=false
    
    for file in init.sql supplement_tables.sql rag_tables.sql; do
        if [ -f "${SQL_DIR}/${file}" ]; then
            log_info "找到: ${file}"
        else
            log_error "缺失: ${file}"
            missing=true
        fi
    done
    
    if [ "$missing" = true ]; then
        log_error "请确保在 backend/sql 目录下运行此脚本"
        exit 1
    fi
}

# 删除所有表
drop_all_tables() {
    log_title "删除所有表"
    
    log_warn "这将删除数据库中的所有表和数据！"
    read -p "是否继续？(yes/no): " confirm
    
    if [ "$confirm" != "yes" ]; then
        log_info "操作已取消"
        exit 0
    fi
    
    log_info "开始删除表..."
    
    # 删除所有表的 SQL
    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} <<EOF
-- 禁用外键约束检查
SET session_replication_role = 'replica';

-- 删除所有表
DO \$\$
DECLARE
    r RECORD;
BEGIN
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public')
    LOOP
        EXECUTE 'DROP TABLE IF EXISTS public.' || quote_ident(r.tablename) || ' CASCADE';
        RAISE NOTICE 'Dropped table: %', r.tablename;
    END LOOP;
END
\$\$;

-- 恢复外键约束检查
SET session_replication_role = 'origin';

-- 显示剩余的表
SELECT tablename FROM pg_tables WHERE schemaname = 'public';
EOF
    
    log_info "所有表已删除"
}

# 初始化基础表
init_base_tables() {
    log_title "初始化基础表 (init.sql)"
    
    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -f "${SQL_DIR}/init.sql"
    
    if [ $? -eq 0 ]; then
        log_info "基础表初始化成功"
    else
        log_error "基础表初始化失败"
        exit 1
    fi
}

# 初始化补充表
init_supplement_tables() {
    log_title "初始化补充表 (supplement_tables.sql)"
    
    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -f "${SQL_DIR}/supplement_tables.sql"
    
    if [ $? -eq 0 ]; then
        log_info "补充表初始化成功"
    else
        log_error "补充表初始化失败"
        exit 1
    fi
}

# 初始化 RAG 表
init_rag_tables() {
    log_title "初始化 RAG 表 (rag_tables.sql)"
    
    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -f "${SQL_DIR}/rag_tables.sql" 2>&1
    
    if [ $? -eq 0 ]; then
        log_info "RAG 表初始化成功"
    else
        log_warn "RAG 表初始化可能失败（如果未安装 pgvector 扩展是正常的）"
    fi
}

# 验证表创建
verify_tables() {
    log_title "验证表创建"
    
    log_info "查询所有表..."
    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} <<EOF
SELECT 
    schemaname,
    tablename,
    pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables 
WHERE schemaname = 'public'
ORDER BY tablename;
EOF
    
    log_info "表统计..."
    PGPASSWORD=${DB_PASSWORD} psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} <<EOF
SELECT COUNT(*) as table_count FROM pg_tables WHERE schemaname = 'public';
EOF
}

# 显示帮助
show_help() {
    cat <<EOF
数据库重建脚本

用法: ./rebuild_database.sh [选项]

环境变量:
    DB_HOST         数据库主机 (默认: localhost)
    DB_PORT         数据库端口 (默认: 5432)
    DB_NAME         数据库名称 (默认: lingyue_zhibao)
    DB_USER         数据库用户 (默认: postgres)
    DB_PASSWORD     数据库密码 (可选，如果未设置将提示输入)

示例:
    # 使用默认配置
    ./rebuild_database.sh

    # 指定数据库配置
    DB_HOST=localhost DB_USER=postgres DB_PASSWORD=123456 ./rebuild_database.sh

    # 仅初始化新表（不删除）
    ./init_supplement_only.sh

注意:
    - 此脚本会删除所有现有表和数据
    - 确保已备份重要数据
    - 需要数据库管理员权限

执行步骤:
    1. 删除所有表
    2. 执行 init.sql（基础表）
    3. 执行 supplement_tables.sql（补充表）
    4. 执行 rag_tables.sql（RAG表）
    5. 验证表创建

EOF
}

# 主函数
main() {
    if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
        show_help
        exit 0
    fi
    
    log_title "数据库重建脚本"
    echo "数据库: ${DB_NAME}"
    echo "主机: ${DB_HOST}:${DB_PORT}"
    echo "用户: ${DB_USER}"
    echo ""
    
    check_sql_files
    drop_all_tables
    init_base_tables
    init_supplement_tables
    init_rag_tables
    verify_tables
    
    log_title "数据库重建完成"
    log_info "所有表已创建并验证"
}

main "$@"
