#!/bin/bash

# ============================================
# 灵越智报 2.0 - 本地启动脚本
# ============================================

set -e

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

# 项目路径
PROJECT_DIR="/home/hws/workspace/GitLab/ay/lingyue-zhibao"
BACKEND_DIR="${PROJECT_DIR}/backend"
JAR_FILE="${BACKEND_DIR}/lingyue-starter/target/lingyue-starter.jar"

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 "${BLUE}=== $1 ===${NC}"; }

# 检查服务状态
check_service() {
    local service=$1
    if systemctl is-active --quiet "$service" 2>/dev/null; then
        echo "running"
    else
        echo "stopped"
    fi
}

# 启动服务
start_service() {
    local service=$1
    local status=$(check_service "$service")
    if [ "$status" = "stopped" ]; then
        log_warn "$service 未运行，正在启动..."
        sudo systemctl start "$service"
        sleep 2
    fi
    log_info "$service ✓"
}

# 检查依赖服务
check_dependencies() {
    log_title "检查依赖服务"
    
    start_service postgresql
    start_service redis
    start_service rabbitmq
}

# 检查 Ollama
check_ollama() {
    log_title "检查 Ollama"
    
    if command -v ollama &> /dev/null; then
        if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
            log_info "Ollama 已运行 ✓"
        else
            log_warn "启动 Ollama..."
            nohup ollama serve > /tmp/ollama.log 2>&1 &
            sleep 3
            if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
                log_info "Ollama 启动成功 ✓"
            else
                log_warn "Ollama 启动失败（RAG 功能将不可用）"
            fi
        fi
    else
        log_warn "Ollama 未安装（RAG 功能将不可用）"
    fi
}

# 编译项目
build_project() {
    log_title "编译项目"
    
    cd "$BACKEND_DIR"
    
    if [ ! -f "$JAR_FILE" ] || [ "$1" = "--rebuild" ]; then
        log_info "正在编译..."
        mvn clean package -DskipTests -q
        log_info "编译完成 ✓"
    else
        log_info "使用已编译的 JAR 文件"
    fi
}

# 启动应用
start_app() {
    log_title "启动灵越智报"
    
    cd "$BACKEND_DIR"
    
    # 检查是否已运行
    if pgrep -f "lingyue-starter.jar" > /dev/null; then
        log_warn "应用已在运行中"
        log_info "使用 './start.sh stop' 停止应用"
        return
    fi
    
    log_info "启动应用..."
    echo ""
    echo -e "${GREEN}================================================${NC}"
    echo -e "${GREEN}  灵越智报 2.0${NC}"
    echo -e "${GREEN}  访问地址: http://localhost:8000${NC}"
    echo -e "${GREEN}  按 Ctrl+C 停止应用${NC}"
    echo -e "${GREEN}================================================${NC}"
    echo ""
    
    java -Xms512m -Xmx1024m \
         -XX:+UseG1GC \
         -jar "$JAR_FILE"
}

# 后台启动
start_background() {
    log_title "后台启动灵越智报"
    
    cd "$BACKEND_DIR"
    
    if pgrep -f "lingyue-starter.jar" > /dev/null; then
        log_warn "应用已在运行中"
        return
    fi
    
    nohup java -Xms512m -Xmx1024m -XX:+UseG1GC \
          -jar "$JAR_FILE" > /tmp/lingyue.log 2>&1 &
    
    sleep 5
    
    if pgrep -f "lingyue-starter.jar" > /dev/null; then
        log_info "应用启动成功 ✓"
        log_info "日志文件: /tmp/lingyue.log"
        log_info "访问地址: http://localhost:8000"
    else
        log_error "应用启动失败，请查看日志: /tmp/lingyue.log"
    fi
}

# 停止应用
stop_app() {
    log_title "停止灵越智报"
    
    if pgrep -f "lingyue-starter.jar" > /dev/null; then
        pkill -f "lingyue-starter.jar"
        log_info "应用已停止 ✓"
    else
        log_warn "应用未在运行"
    fi
}

# 查看状态
show_status() {
    log_title "服务状态"
    
    echo -e "PostgreSQL: $(check_service postgresql)"
    echo -e "Redis:      $(check_service redis)"
    echo -e "RabbitMQ:   $(check_service rabbitmq)"
    
    if command -v ollama &> /dev/null && curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
        echo -e "Ollama:     running"
    else
        echo -e "Ollama:     stopped"
    fi
    
    if pgrep -f "lingyue-starter.jar" > /dev/null; then
        echo -e "灵越智报:   running (http://localhost:8000)"
    else
        echo -e "灵越智报:   stopped"
    fi
}

# 查看日志
show_logs() {
    if [ -f /tmp/lingyue.log ]; then
        tail -f /tmp/lingyue.log
    else
        log_error "日志文件不存在"
    fi
}

# 初始化数据库
init_db() {
    log_title "初始化数据库"
    
    cd "$PROJECT_DIR"
    
    log_info "执行基础表初始化..."
    psql -U lingyue -d lingyue_zhibao -f backend/sql/init.sql
    
    if [ -f backend/sql/supplement_tables.sql ]; then
        log_info "执行补充表初始化..."
        psql -U lingyue -d lingyue_zhibao -f backend/sql/supplement_tables.sql
    fi
    
    log_info "数据库初始化完成 ✓"
}

# 初始化 RAG 表
init_rag() {
    log_title "初始化 RAG 表"
    
    cd "$PROJECT_DIR"
    
    # 检查 pgvector
    if psql -U lingyue -d lingyue_zhibao -c "CREATE EXTENSION IF NOT EXISTS vector;" 2>/dev/null; then
        log_info "pgvector 扩展已启用 ✓"
        psql -U lingyue -d lingyue_zhibao -f backend/sql/rag_tables.sql
        log_info "RAG 表初始化完成 ✓"
    else
        log_error "pgvector 未安装，请先安装: yay -S postgresql-pgvector"
    fi
}

# 显示帮助
show_help() {
    cat << EOF
灵越智报 2.0 - 本地启动脚本

用法: ./start.sh [命令]

命令:
    (无参数)      编译并前台启动应用
    -d, daemon    编译并后台启动应用
    stop          停止应用
    status        查看服务状态
    logs          查看应用日志
    build         仅编译项目
    init-db       初始化基础数据库表
    init-rag      初始化 RAG 向量表（需要 pgvector）
    help          显示此帮助信息

示例:
    ./start.sh              # 前台启动
    ./start.sh -d           # 后台启动
    ./start.sh stop         # 停止应用
    ./start.sh status       # 查看状态
    ./start.sh init-db      # 初始化数据库

EOF
}

# 主函数
main() {
    case "${1:-}" in
        -d|daemon)
            check_dependencies
            check_ollama
            build_project
            start_background
            ;;
        stop)
            stop_app
            ;;
        status)
            show_status
            ;;
        logs)
            show_logs
            ;;
        build|--rebuild)
            build_project --rebuild
            ;;
        init-db)
            init_db
            ;;
        init-rag)
            init_rag
            ;;
        help|--help|-h)
            show_help
            ;;
        "")
            check_dependencies
            check_ollama
            build_project
            start_app
            ;;
        *)
            log_error "未知命令: $1"
            show_help
            exit 1
            ;;
    esac
}

main "$@"
