#!/bin/bash
# ================================================
# Urban Lifeline - 前端服务管理脚本
# 
# 用法:
#   ./web-manager.sh start-all           # 启动所有前端
#   ./web-manager.sh start platform      # 启动单个前端
#   ./web-manager.sh stop platform       # 停止单个前端
#   ./web-manager.sh restart platform    # 重启单个前端
#   ./web-manager.sh status              # 查看状态
# ================================================

set -e

SITES_DIR="/app/sites"
PID_DIR="/app/pids"
LOG_DIR="/app/logs"
CONFIG_DIR="/app/config"

mkdir -p "$PID_DIR" "$LOG_DIR"

# ============================================
# 配置处理函数
# ============================================

# 同步挂载的配置文件到站点目录
sync_mounted_config() {
    local web=$1
    local mounted_config="${CONFIG_DIR}/app-config-${web}.js"
    local site_config="${SITES_DIR}/${web}/app-config.js"
    
    if [ -f "$mounted_config" ]; then
        log_info "同步挂载配置: $mounted_config -> $site_config"
        cp "$mounted_config" "$site_config"
        return 0
    else
        log_warn "$web 没有挂载配置文件，使用构建默认配置"
        return 1
    fi
}

# 处理所有前端配置
sync_all_configs() {
    log_info "=========================================="
    log_info "  同步前端配置文件"
    log_info "=========================================="
    
    for web in "${BOOT_ORDER[@]}"; do
        sync_mounted_config "$web"
    done
    
    log_info "配置同步完成"
}

# 前端配置: 名称=端口环境变量名:默认端口
declare -A WEBS=(
    ["shared"]="SHARED_PORT:8000"
    ["platform"]="PLATFORM_PORT:8001"
    ["workcase"]="WORKCASE_PORT:8002"
    # ["bidding"]="BIDDING_PORT:8003"
    # ["workcase_wechat"]="WORKCASE_WECHAT_PORT:8004"
)

# shared 必须最先启动 (其他模块依赖它)
# BOOT_ORDER=(shared platform workcase bidding workcase_wechat)
BOOT_ORDER=(shared platform workcase)

# 颜色
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"; }

# 获取端口
get_port() {
    local web=$1
    local config=${WEBS[$web]}
    local env_name=$(echo "$config" | cut -d: -f1)
    local default_port=$(echo "$config" | cut -d: -f2)
    echo "${!env_name:-$default_port}"
}

# 检查是否运行
is_running() {
    local web=$1
    local pid_file="${PID_DIR}/${web}.pid"
    
    if [ -f "$pid_file" ]; then
        local pid=$(cat "$pid_file")
        if kill -0 "$pid" 2>/dev/null; then
            return 0
        fi
    fi
    return 1
}

# 等待服务就绪
wait_for_web() {
    local web=$1
    local port=$(get_port "$web")
    local max_wait=30
    local count=0
    
    while [ $count -lt $max_wait ]; do
        if curl -sf "http://localhost:${port}/" > /dev/null 2>&1; then
            return 0
        fi
        sleep 1
        count=$((count + 1))
    done
    return 1
}

# 启动单个前端
start_web() {
    local web=$1
    local skip_config=$2
    local port=$(get_port "$web")
    local site_dir="${SITES_DIR}/${web}"
    local pid_file="${PID_DIR}/${web}.pid"
    local log_file="${LOG_DIR}/${web}.log"
    
    if [ ! -d "$site_dir" ]; then
        log_error "站点目录不存在: $site_dir"
        return 1
    fi
    
    if is_running "$web"; then
        log_warn "$web 已在运行 (PID: $(cat $pid_file))"
        return 0
    fi
    
    # 同步配置 (除非已经批量同步过)
    if [ "$skip_config" != "skip_config" ]; then
        sync_mounted_config "$web"
    fi
    
    log_info "启动 $web (端口: $port)..."

    # 使用 serve 启动静态服务，--single 确保SPA路由正确处理
    nohup serve -s "$site_dir" -l "$port" --single > "$log_file" 2>&1 &
    local pid=$!
    echo $pid > "$pid_file"

    log_info "$web 已启动 (PID: $pid)"
}

# 停止单个前端
stop_web() {
    local web=$1
    local pid_file="${PID_DIR}/${web}.pid"
    
    if ! is_running "$web"; then
        log_warn "$web 未在运行"
        return 0
    fi
    
    local pid=$(cat "$pid_file")
    log_info "停止 $web (PID: $pid)..."
    
    kill -15 "$pid" 2>/dev/null || true
    
    local count=0
    while [ $count -lt 10 ] && kill -0 "$pid" 2>/dev/null; do
        sleep 1
        count=$((count + 1))
    done
    
    if kill -0 "$pid" 2>/dev/null; then
        kill -9 "$pid" 2>/dev/null || true
    fi
    
    rm -f "$pid_file"
    log_info "$web 已停止"
}

# 重启
restart_web() {
    local web=$1
    stop_web "$web"
    sleep 1
    start_web "$web"
}

# 启动所有
start_all() {
    log_info "=========================================="
    log_info "  Urban Lifeline - 启动所有前端"
    log_info "=========================================="
    
    # 同步所有挂载的配置文件
    sync_all_configs
    
    for web in "${BOOT_ORDER[@]}"; do
        start_web "$web" "skip_config"
        
        log_info "等待 $web 就绪..."
        if wait_for_web "$web"; then
            log_info "$web 已就绪 ✓"
        else
            log_warn "$web 健康检查超时"
        fi
    done
    
    log_info "=========================================="
    log_info "  所有前端启动完成"
    log_info "=========================================="
    
    show_status
    monitor_webs
}

# 停止所有
stop_all() {
    log_info "停止所有前端..."
    for web in "${BOOT_ORDER[@]}"; do
        stop_web "$web"
    done
}

# 状态
show_status() {
    echo ""
    echo "=========================================="
    echo "  Urban Lifeline 前端状态"
    echo "=========================================="
    printf "%-18s %-8s %-8s %-10s\n" "站点" "端口" "PID" "状态"
    echo "------------------------------------------"
    
    for web in "${BOOT_ORDER[@]}"; do
        local port=$(get_port "$web")
        local pid_file="${PID_DIR}/${web}.pid"
        local pid="-"
        local status="${RED}停止${NC}"
        
        if [ -f "$pid_file" ]; then
            pid=$(cat "$pid_file")
            if kill -0 "$pid" 2>/dev/null; then
                status="${GREEN}运行中${NC}"
            fi
        fi
        
        printf "%-18s %-8s %-8s " "$web" "$port" "$pid"
        echo -e "$status"
    done
    echo "=========================================="
}

# 监控
monitor_webs() {
    log_info "进入监控模式..."
    trap 'stop_all; exit 0' SIGTERM SIGINT
    
    while true; do
        sleep 30
        for web in "${BOOT_ORDER[@]}"; do
            if ! is_running "$web"; then
                log_warn "$web 已停止，尝试重启..."
                start_web "$web"
            fi
        done
    done
}

# 主入口
case "${1:-help}" in
    start-all)
        start_all
        ;;
    stop-all)
        stop_all
        ;;
    start)
        [ -z "$2" ] && { log_error "请指定站点名"; exit 1; }
        start_web "$2"
        ;;
    stop)
        [ -z "$2" ] && { log_error "请指定站点名"; exit 1; }
        stop_web "$2"
        ;;
    restart)
        [ -z "$2" ] && { log_error "请指定站点名"; exit 1; }
        restart_web "$2"
        ;;
    status)
        show_status
        ;;
    *)
        echo "Urban Lifeline 前端管理"
        echo ""
        echo "用法: $0 <命令> [站点名]"
        echo ""
        echo "命令:"
        echo "  start-all          启动所有前端"
        echo "  stop-all           停止所有前端"
        echo "  start <站点>       启动指定站点"
        echo "  stop <站点>        停止指定站点"
        echo "  restart <站点>     重启指定站点"
        echo "  status             查看状态"
        echo ""
        echo "可用站点: ${!WEBS[*]}"
        echo ""
        echo "端口配置 (环境变量):"
        echo "  SHARED_PORT         默认 8000 (公共模块，必须最先启动)"
        echo "  PLATFORM_PORT       默认 8001"
        echo "  WORKCASE_PORT       默认 8002"
        echo "  BIDDING_PORT        默认 8003"
        echo "  WORKCASE_WECHAT_PORT 默认 8004"
        ;;
esac
