#!/bin/bash

# ============================================
# 灵越智报 - 服务器端重新部署脚本
# 在服务器上直接运行，用于更新后重启应用
# ============================================

set -e

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

# ========== 配置 ==========
PROJECT_DIR="/mnt/win_home/lingyue-zhibao"
MAVEN_REPO="/mnt/win_home/.m2/repository"
LOG_FILE="/var/log/lingyue.log"
JAR_NAME="lingyue-starter.jar"
JAR_PATH="${PROJECT_DIR}/backend/lingyue-starter/target/${JAR_NAME}"
APP_PORT=5232

# JVM 参数
JVM_OPTS="-Xms1g -Xmx2g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError"
# ===========================

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

# 停止应用
stop_app() {
    log_info "停止应用..."
    pkill -f "${JAR_NAME}" 2>/dev/null || true
    sleep 2
    
    if pgrep -f "${JAR_NAME}" > /dev/null 2>&1; then
        log_warn "强制终止..."
        pkill -9 -f "${JAR_NAME}" 2>/dev/null || true
        sleep 1
    fi
    
    log_info "应用已停止"
}

# 编译
build() {
    log_info "编译项目..."
    cd ${PROJECT_DIR}/backend
    rm -rf lingyue-starter/target 2>/dev/null || true
    mvn clean package -DskipTests -q -Dmaven.repo.local=${MAVEN_REPO}
    log_info "编译完成"
}

# 启动应用（前台）
start_foreground() {
    log_info "启动应用（前台模式）..."
    cd ${PROJECT_DIR}/backend
    echo ""
    echo -e "${GREEN}================================================${NC}"
    echo -e "${GREEN}  灵越智报 2.0${NC}"
    echo -e "${GREEN}  访问地址: http://localhost:${APP_PORT}${NC}"
    echo -e "${GREEN}  按 Ctrl+C 停止${NC}"
    echo -e "${GREEN}================================================${NC}"
    echo ""
    java ${JVM_OPTS} -jar ${JAR_PATH}
}

# 启动应用（后台）
start_background() {
    log_info "启动应用（后台模式）..."
    cd ${PROJECT_DIR}/backend
    nohup java ${JVM_OPTS} -jar ${JAR_PATH} > ${LOG_FILE} 2>&1 &
    
    sleep 5
    
    if pgrep -f "${JAR_NAME}" > /dev/null 2>&1; then
        local pid=$(pgrep -f "${JAR_NAME}")
        log_info "应用启动成功 (PID: $pid)"
        log_info "访问地址: http://localhost:${APP_PORT}"
        log_info "日志文件: ${LOG_FILE}"
    else
        log_error "启动失败，查看日志: tail -100 ${LOG_FILE}"
        exit 1
    fi
}

# 查看状态
status() {
    if pgrep -f "${JAR_NAME}" > /dev/null 2>&1; then
        local pid=$(pgrep -f "${JAR_NAME}")
        log_info "应用运行中 (PID: $pid)"
        log_info "端口: ${APP_PORT}"
        
        # 健康检查
        local health=$(curl -s http://localhost:${APP_PORT}/actuator/health 2>/dev/null || echo "")
        if [ -n "$health" ]; then
            echo "$health"
        fi
    else
        log_warn "应用未运行"
    fi
}

# 查看日志
logs() {
    if [ -f ${LOG_FILE} ]; then
        tail -${1:-100} ${LOG_FILE}
    else
        log_warn "日志文件不存在"
    fi
}

# 实时日志
tail_logs() {
    if [ -f ${LOG_FILE} ]; then
        tail -f ${LOG_FILE}
    else
        log_warn "日志文件不存在"
    fi
}

# 显示帮助
show_help() {
    cat <<EOF
灵越智报 - 服务器端重新部署脚本

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

命令:
    (无参数)    重新编译并前台启动
    -d          重新编译并后台启动
    start       仅启动（不编译），前台模式
    start -d    仅启动（不编译），后台模式
    stop        停止应用
    restart     重启应用（不重新编译）
    status      查看状态
    logs [n]    查看最近 n 行日志（默认100）
    tail        实时查看日志
    build       仅编译（不启动）
    help        显示帮助

示例:
    ./redeploy.sh           # 重新编译并前台启动
    ./redeploy.sh -d        # 重新编译并后台启动
    ./redeploy.sh restart   # 快速重启
    ./redeploy.sh logs 200  # 查看最近200行日志

EOF
}

# 主函数
main() {
    case "${1:-}" in
        "")
            stop_app
            build
            start_foreground
            ;;
        -d|--daemon)
            stop_app
            build
            start_background
            ;;
        start)
            stop_app
            if [ "${2:-}" = "-d" ]; then
                start_background
            else
                start_foreground
            fi
            ;;
        stop)
            stop_app
            ;;
        restart)
            stop_app
            if [ "${2:-}" = "-d" ]; then
                start_background
            else
                start_foreground
            fi
            ;;
        status)
            status
            ;;
        logs)
            logs ${2:-100}
            ;;
        tail)
            tail_logs
            ;;
        build)
            build
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            log_error "未知命令: $1"
            show_help
            exit 1
            ;;
    esac
}

main "$@"
