#!/usr/bin/env bash
# ═══════════════════════════════════════════════════════════════════════
#  BBRab Platform v6 — Management Script (bbrabctl)
#  用法: ./bbrabctl {start|stop|restart|status|logs|health|payment-status|configure-webpay|backup|console|version}
# ═══════════════════════════════════════════════════════════════════════
set -euo pipefail

B='\033[1m'; G='\033[32m'; Y='\033[33m'; C='\033[36m'; R='\033[31m'; N='\033[0m'

# ── Resolve install dir (script location) ──
BBRAB_HOME="$(cd "$(dirname "$0")" && pwd)"
VENV="$BBRAB_HOME/venv"
DATA_DIR="$BBRAB_HOME/data"
LOG_DIR="$BBRAB_HOME/logs"
PID_FILE="$BBRAB_HOME/.bbrab.pid"
REMOTE_RELAY_PID_FILE="$BBRAB_HOME/.bbrab-remote-relay.pid"
LOCAL_AI_PID_FILE="$BBRAB_HOME/.bbrab-local-ai.pid"
CONF_FILE="$BBRAB_HOME/.bbrab.env"

# ── Load config ──
PORT="${BBRAB_PORT:-8775}"
if [ -f "$CONF_FILE" ]; then
    set -a; source "$CONF_FILE" 2>/dev/null; set +a
    PORT="${BBRAB_PORT:-8775}"
fi

PYTHON="$VENV/bin/python3"
[ ! -f "$PYTHON" ] && PYTHON="python3"
export BBRAB_LOCAL_EDITION="${BBRAB_LOCAL_EDITION:-1}"
export BBRAB_DB_PATH="${BBRAB_DB_PATH:-$DATA_DIR/bbrab_platform.db}"
export BBRAB_LOG_DIR="${BBRAB_LOG_DIR:-$LOG_DIR}"
export BBRAB_BACKUP_DIR="${BBRAB_BACKUP_DIR:-$BBRAB_HOME/backups}"
export BBRAB_PRIVATE_AI_ONLY="${BBRAB_PRIVATE_AI_ONLY:-1}"

ok()   { echo -e "  ${G}✓${N} $1"; }
err()  { echo -e "  ${R}✗${N} $1"; }
info() { echo -e "  ${C}$1${N}"; }

ensure_local_ai() {
    local AI_PYTHON="$BBRAB_HOME/data/local-ai/venv/bin/python"
    local AI_MANAGER="$BBRAB_HOME/bbrab_local_chat.py"
    local AI_TOKEN_FILE="$BBRAB_HOME/data/secrets/local-chat.token"
    if [ ! -x "$AI_PYTHON" ] || [ ! -f "$AI_MANAGER" ]; then
        echo -e "  ${Y}⚠${N} BBRab 本地文本模型未完整安装；视频基础剪辑和已安装的本地媒体模型不受影响"
        return 0
    fi
    mkdir -p "$LOG_DIR"
    local AI_STATUS READY BASE_URL MODEL_ID
    if ! AI_STATUS=$("$AI_PYTHON" "$AI_MANAGER" 2>> "$LOG_DIR/local-ai.log"); then
        echo -e "  ${Y}⚠${N} BBRab 本地 AI 服务启动失败；查看 $LOG_DIR/local-ai.log"
        return 0
    fi
    READY=$(printf '%s' "$AI_STATUS" | "$AI_PYTHON" -c 'import json,sys; print("1" if json.load(sys.stdin).get("ready") else "0")' 2>/dev/null || echo 0)
    BASE_URL=$(printf '%s' "$AI_STATUS" | "$AI_PYTHON" -c 'import json,sys; print(json.load(sys.stdin).get("base_url", ""))' 2>/dev/null || true)
    MODEL_ID=$(printf '%s' "$AI_STATUS" | "$AI_PYTHON" -c 'import json,sys; print(json.load(sys.stdin).get("model", ""))' 2>/dev/null || true)
    if [ "$READY" != "1" ] || [ -z "$BASE_URL" ] || [ -z "$MODEL_ID" ] || [ ! -s "$AI_TOKEN_FILE" ]; then
        echo -e "  ${Y}⚠${N} BBRab 本地文本模型未就绪；不会回退到外部推理服务"
        return 0
    fi
    export BBRAB_LOCAL_AI_ENABLED=1
    export BBRAB_LOCAL_AI_BASE_URL="$BASE_URL"
    export BBRAB_LOCAL_AI_MODEL="$MODEL_ID"
    export BBRAB_LOCAL_AI_API_KEY="$(tr -d '\r\n' < "$AI_TOKEN_FILE")"
    ok "BBRab 本地私有 AI 服务已就绪（${MODEL_ID}，仅监听回环地址）"
}

stop_local_ai() {
    local AI_PYTHON="$BBRAB_HOME/data/local-ai/venv/bin/python"
    local AI_MANAGER="$BBRAB_HOME/bbrab_local_chat.py"
    if [ -x "$AI_PYTHON" ] && [ -f "$AI_MANAGER" ]; then
        (cd "$BBRAB_HOME" && "$AI_PYTHON" -c 'import bbrab_local_chat; bbrab_local_chat.stop()') >/dev/null 2>&1 || true
    fi
    rm -f "$LOCAL_AI_PID_FILE"
}

get_pid() {
    if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE" 2>/dev/null)" 2>/dev/null; then
        cat "$PID_FILE"
    elif command -v lsof &>/dev/null && lsof -ti:"$PORT" &>/dev/null; then
        lsof -ti:"$PORT"
    else
        echo ""
    fi
}

cmd_start() {
    local PID=$(get_pid)
    if [ -n "$PID" ]; then
        echo -e "  ${Y}⚠${N} 服务已在运行 (PID: $PID)"
        return 0
    fi

    mkdir -p "$LOG_DIR" "$DATA_DIR"
    cd "$BBRAB_HOME"

    # Activate venv if exists
    if [ -f "$VENV/bin/activate" ]; then
        source "$VENV/bin/activate"
    fi

    ensure_local_ai

    nohup $PYTHON bbrab_preview_server.py >> "$LOG_DIR/bbrab.log" 2>> "$LOG_DIR/errors.log" &
    echo $! > "$PID_FILE"
    sleep 1

    # Health check
    for i in 1 2 3 4 5 6 7 8; do
        sleep 1
        if curl -s -o /dev/null -w "%{http_code}" "http://127.0.0.1:$PORT/api/health" 2>/dev/null | grep -q "200"; then
            ok "服务已启动 (PID: $(cat "$PID_FILE"), 端口: $PORT)"
            info "访问: http://127.0.0.1:$PORT"
            return 0
        fi
    done

    err "服务启动超时 — 检查日志: $LOG_DIR/errors.log"
    info "最近日志:"
    tail -5 "$LOG_DIR/errors.log" 2>/dev/null || echo "  (无日志)"
    return 1
}

cmd_foreground() {
    local PID=$(get_pid)
    if [ -n "$PID" ]; then
        echo -e "  ${Y}⚠${N} 服务已在运行 (PID: $PID)"
        return 0
    fi

    mkdir -p "$LOG_DIR" "$DATA_DIR"
    cd "$BBRAB_HOME"
    if [ -f "$VENV/bin/activate" ]; then
        source "$VENV/bin/activate"
    fi
    ensure_local_ai
    exec "$PYTHON" bbrab_preview_server.py
}

cmd_stop() {
    local PID=$(get_pid)
    if [ -z "$PID" ]; then
        info "服务未运行"
        rm -f "$PID_FILE"
        stop_local_ai
        return 0
    fi

    kill "$PID" 2>/dev/null
    for i in 1 2 3 4 5; do
        sleep 1
        if ! kill -0 "$PID" 2>/dev/null; then
            ok "服务已停止 (PID: $PID)"
            rm -f "$PID_FILE"
            stop_local_ai
            return 0
        fi
    done

    kill -9 "$PID" 2>/dev/null || true
    ok "服务已强制停止 (PID: $PID)"
    rm -f "$PID_FILE"
    stop_local_ai
}

cmd_restart() {
    cmd_stop
    sleep 1
    cmd_start
}

cmd_status() {
    local PID=$(get_pid)
    if [ -z "$PID" ]; then
        info "状态: ${R}未运行${N}"
        return 1
    fi

    echo -e "  ${G}运行中${N} (PID: $PID, 端口: $PORT)"
    echo ""

    # Health check
    local HEALTH
    HEALTH=$(curl -s "http://127.0.0.1:$PORT/api/health" 2>/dev/null || echo "")
    if [ -n "$HEALTH" ]; then
        if echo "$HEALTH" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'  数据库: {d.get(\"database\",\"?\")}, 用户: {d.get(\"users\",\"?\")}, 模型: {d.get(\"models\",\"?\")}, 延迟: {d.get(\"db_latency_ms\",\"?\")}ms')" 2>/dev/null; then
            :
        else
            info "健康检查: $HEALTH"
        fi
    else
        err "健康检查失败 — 服务可能未正常响应"
    fi

    # Uptime
    if [ -f "$PID_FILE" ]; then
        local STARTED=$(stat -f "%m" "$PID_FILE" 2>/dev/null || stat -c "%Y" "$PID_FILE" 2>/dev/null || echo "")
        if [ -n "$STARTED" ]; then
            local NOW=$(date +%s)
            local UPTIME=$((NOW - STARTED))
            local HOURS=$((UPTIME / 3600))
            local MINS=$(((UPTIME % 3600) / 60))
            echo -e "  运行时间: ${HOURS}h ${MINS}m"
        fi
    fi
}

cmd_logs() {
    local N=${1:-50}
    info "最近 $N 行日志:"
    echo ""
    if [ -f "$LOG_DIR/bbrab.log" ]; then
        tail -n "$N" "$LOG_DIR/bbrab.log" 2>/dev/null
    else
        err "日志文件不存在: $LOG_DIR/bbrab.log"
    fi
}

cmd_health() {
    local HEALTH
    HEALTH=$(curl -s "http://127.0.0.1:$PORT/api/health" 2>/dev/null || echo "")
    if [ -n "$HEALTH" ]; then
        echo -e "  ${G}✓${N} 健康检查通过"
        echo "$HEALTH" | python3 -m json.tool 2>/dev/null || echo "  $HEALTH"
    else
        err "健康检查失败 — 服务未响应 (端口: $PORT)"
        return 1
    fi
}

cmd_payment_status() {
    cd "$BBRAB_HOME"
    "$PYTHON" -B "$BBRAB_HOME/deploy/payment_status.py"
}

cmd_configure_webpay() {
    cd "$BBRAB_HOME"
    "$PYTHON" -B "$BBRAB_HOME/deploy/configure_alipay_webpay.py" "$@"
}

cmd_configure_aipay() {
    cd "$BBRAB_HOME"
    "$PYTHON" -B "$BBRAB_HOME/deploy/configure_alipay_aipay_precreate.py" "$@"
}

cmd_backup() {
    mkdir -p "$BBRAB_HOME/backups"
    if [ -f "$DATA_DIR/bbrab_platform.db" ]; then
        local RESULT
        RESULT=$($PYTHON -B "$BBRAB_HOME/backup.py" 2>/dev/null || echo "")
        if [ -n "$RESULT" ]; then
            ok "备份完成"
            echo "$RESULT" | $PYTHON -m json.tool 2>/dev/null || echo "$RESULT"
        else
            err "备份失败 — 请检查日志"
            return 1
        fi
    else
        err "数据库文件不存在"
        return 1
    fi
}

cmd_console() {
    if [ ! -f "$BBRAB_HOME/local_control.py" ]; then
        err "本地控制模块缺失: $BBRAB_HOME/local_control.py"
        return 1
    fi
    if [ -z "$(get_pid)" ]; then
        info "服务未运行，正在启动..."
        cmd_start
    fi
    local URL
    URL=$($PYTHON -B "$BBRAB_HOME/local_control.py" issue --base-url "http://127.0.0.1:$PORT")
    if command -v open &>/dev/null; then
        open "$URL"
        ok "本机运维台已安全打开（票据 90 秒内一次有效）"
    elif command -v xdg-open &>/dev/null; then
        xdg-open "$URL" >/dev/null 2>&1 &
        ok "本机运维台已安全打开（票据 90 秒内一次有效）"
    else
        info "请在本机浏览器打开以下一次性链接（90 秒内有效）:"
        echo "  $URL"
    fi
}

get_remote_relay_pid() {
    if [ -f "$REMOTE_RELAY_PID_FILE" ] && kill -0 "$(cat "$REMOTE_RELAY_PID_FILE" 2>/dev/null)" 2>/dev/null; then
        cat "$REMOTE_RELAY_PID_FILE"
    else
        echo ""
    fi
}

cmd_remote_relay_start() {
    local PID=$(get_remote_relay_pid)
    if [ -n "$PID" ]; then
        echo -e "  ${Y}⚠${N} 远程中继已在运行 (PID: $PID)"
        return 0
    fi
    if ! "$PYTHON" -c "import websockets" >/dev/null 2>&1; then
        err "缺少 websockets 依赖，请先执行 $PYTHON -m pip install -r requirements.txt"
        return 1
    fi
    mkdir -p "$LOG_DIR" "$DATA_DIR"
    cd "$BBRAB_HOME"
    nohup "$PYTHON" -B remote_relay.py >> "$LOG_DIR/remote-relay.log" 2>&1 &
    echo $! > "$REMOTE_RELAY_PID_FILE"
    sleep 1
    PID=$(get_remote_relay_pid)
    if [ -n "$PID" ]; then
        ok "远程中继已启动 (PID: $PID，仅监听 127.0.0.1:${BBRAB_REMOTE_RELAY_PORT:-8777})"
        return 0
    fi
    err "远程中继启动失败，请查看 $LOG_DIR/remote-relay.log"
    return 1
}

cmd_remote_relay_stop() {
    local PID=$(get_remote_relay_pid)
    if [ -z "$PID" ]; then
        info "远程中继未运行"
        rm -f "$REMOTE_RELAY_PID_FILE"
        return 0
    fi
    kill "$PID" 2>/dev/null || true
    for i in 1 2 3 4 5; do
        sleep 1
        if ! kill -0 "$PID" 2>/dev/null; then
            rm -f "$REMOTE_RELAY_PID_FILE"
            ok "远程中继已停止"
            return 0
        fi
    done
    err "远程中继未能正常停止 (PID: $PID)"
    return 1
}

cmd_remote_relay_status() {
    local PID=$(get_remote_relay_pid)
    if [ -n "$PID" ]; then
        echo -e "  ${G}运行中${N} (PID: $PID, 回环端口: ${BBRAB_REMOTE_RELAY_PORT:-8777})"
        info "生产环境必须由同机 HTTPS 反向代理提供外部 WSS，不能直接暴露此端口"
    else
        info "状态: ${R}未运行${N}"
        return 1
    fi
}

cmd_version() {
    info "BBRab Platform ${BBRAB_VERSION:-v6.local}"
    info "Python: $($PYTHON --version 2>&1)"
    info "安装目录: $BBRAB_HOME"
    info "端口: $PORT"
    info "配置: $CONF_FILE"
    info "数据库: $DATA_DIR/bbrab_platform.db"
}

# ─────────────────────────────────────────────────────────────────────
# Main
# ─────────────────────────────────────────────────────────────────────
case "${1:-help}" in
    start)   cmd_start ;;
    foreground) cmd_foreground ;;
    stop)    cmd_stop ;;
    restart) cmd_restart ;;
    status)  cmd_status ;;
    logs)    cmd_logs "${2:-50}" ;;
    health)  cmd_health ;;
    payment-status) cmd_payment_status ;;
    configure-webpay) shift; cmd_configure_webpay "$@" ;;
    configure-aipay) shift; cmd_configure_aipay "$@" ;;
    backup)  cmd_backup ;;
    console) cmd_console ;;
    remote-relay-start) cmd_remote_relay_start ;;
    remote-relay-stop) cmd_remote_relay_stop ;;
    remote-relay-status) cmd_remote_relay_status ;;
    version) cmd_version ;;
    *)
        echo -e "${B}BBRab Platform v6 — 管理脚本${N}"
        echo ""
        echo "用法: $0 <命令>"
        echo ""
        echo "命令:"
        echo "  start     启动服务"
        echo "  foreground 前台常驻启动（用于开发预览）"
        echo "  stop      停止服务"
        echo "  restart   重启服务"
        echo "  status    查看状态"
        echo "  logs [N]  查看最近 N 行日志 (默认 50)"
        echo "  health    健康检查"
        echo "  payment-status  分别查看 AI付扫码、AI网页收款和AI按量付费状态"
        echo "  configure-webpay  安全写入支付宝网页收款生产配置（密钥使用文件路径）"
        echo "  configure-aipay  安全写入原 AI付扫码收款生产配置（不是AI按量付费）"
        echo "  backup    备份数据库"
        echo "  console   安全打开本机运维台"
        echo "  remote-relay-start   启动回环远程数据中继"
        echo "  remote-relay-stop    停止回环远程数据中继"
        echo "  remote-relay-status  查看远程中继状态"
        echo "  version   版本信息"
        echo ""
        ;;
esac
