#!/bin/bash
#
# SmartClean 启动脚本
# 用法:
#   ./start.sh          # 启动所有服务 (public编译 + web + task + frontend)
#   ./start.sh web      # 仅启动后端 web 服务
#   ./start.sh task     # 仅启动后端 task 服务
#   ./start.sh front    # 仅启动前端
#   ./start.sh backend  # 启动后端 web + task
#   ./start.sh stop     # 停止所有服务

# 初始化 SDKMAN 并切换 Java 8
export SDKMAN_DIR="$HOME/.sdkman"
source "$SDKMAN_DIR/bin/sdkman-init.sh"
sdk use java 8.0.432-zulu > /dev/null 2>&1

ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
PUBLIC_DIR="$ROOT_DIR/backend/xiaoqu-intellectual-public"
WEB_DIR="$ROOT_DIR/backend/xiaoqu-intellectual-web"
TASK_DIR="$ROOT_DIR/backend/xiaoqu-intellectual-task"
FRONT_DIR="$ROOT_DIR/frontend/witcleansystem"
LOG_DIR="$ROOT_DIR/logs"
PROFILE="test"

mkdir -p "$LOG_DIR"

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

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

install_public() {
    log_info "编译安装 public 模块..."
    cd "$PUBLIC_DIR" && mvn clean install -q -DskipTests
    if [ $? -ne 0 ]; then
        log_error "public 模块编译失败"
        exit 1
    fi
    log_info "public 模块编译完成"
}

start_web() {
    log_info "启动 Web 服务 (端口 8095, profile=$PROFILE)..."
    cd "$WEB_DIR"
    mvn spring-boot:run -Dspring-boot.run.profiles=$PROFILE -q > "$LOG_DIR/web.log" 2>&1 &
    echo $! > "$LOG_DIR/web.pid"
    log_info "Web 服务已启动, PID=$(cat "$LOG_DIR/web.pid"), 日志: $LOG_DIR/web.log"
}

start_task() {
    log_info "启动 Task 服务 (端口 8097, profile=$PROFILE)..."
    cd "$TASK_DIR"
    mvn spring-boot:run -Dspring-boot.run.profiles=$PROFILE -q > "$LOG_DIR/task.log" 2>&1 &
    echo $! > "$LOG_DIR/task.pid"
    log_info "Task 服务已启动, PID=$(cat "$LOG_DIR/task.pid"), 日志: $LOG_DIR/task.log"
}

start_front() {
    log_info "启动前端开发服务 (端口 8079)..."
    cd "$FRONT_DIR"
    if [ ! -d "node_modules" ]; then
        log_warn "未检测到 node_modules, 正在安装依赖..."
        npm install
    fi
    npm run dev > "$LOG_DIR/front.log" 2>&1 &
    echo $! > "$LOG_DIR/front.pid"
    log_info "前端服务已启动, PID=$(cat "$LOG_DIR/front.pid"), 日志: $LOG_DIR/front.log"
}

stop_all() {
    log_info "停止所有服务..."
    for name in web task front; do
        pid_file="$LOG_DIR/$name.pid"
        if [ -f "$pid_file" ]; then
            pid=$(cat "$pid_file")
            if kill -0 "$pid" 2>/dev/null; then
                kill "$pid"
                log_info "已停止 $name 服务 (PID=$pid)"
            fi
            rm -f "$pid_file"
        fi
    done
}

case "${1:-all}" in
    web)
        install_public
        start_web
        ;;
    task)
        install_public
        start_task
        ;;
    backend)
        install_public
        start_web
        start_task
        ;;
    front)
        start_front
        ;;
    all)
        install_public
        start_web
        start_task
        start_front
        ;;
    stop)
        stop_all
        ;;
    *)
        echo "用法: $0 {all|web|task|backend|front|stop}"
        exit 1
        ;;
esac

echo ""
log_info "========================================"
log_info "  前端:  http://localhost:8079"
log_info "  Web:   http://localhost:8095"
log_info "  Task:  http://localhost:8097"
log_info "========================================"
