#!/usr/bin/env bash
# YunZhi UEBA Receiver - Start/Stop/Status script
set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PID_FILE="${SCRIPT_DIR}/ueba_receiver.pid"
LOG_FILE="${SCRIPT_DIR}/ueba_receiver.log"
export PYTHONPATH="${SCRIPT_DIR}:$PYTHONPATH"
CMD="python3 ${SCRIPT_DIR}/receiver/main.py"

usage() {
    echo "Usage: $0 {start|stop|restart|status|logs}"
    echo ""
    echo "Commands:"
    echo "  start   - Start in background (daemon mode)"
    echo "  stop    - Stop the running instance"
    echo "  restart - Restart the service"
    echo "  status  - Check if running"
    echo "  logs    - Tail the log file (Ctrl+C to exit)"
    exit 1
}

get_pid() {
    if [ -f "$PID_FILE" ]; then
        cat "$PID_FILE"
    fi
}

is_running() {
    pid=$(get_pid)
    if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
        return 0
    fi
    return 1
}

do_start() {
    if is_running; then
        echo "Already running with PID $(get_pid) (log: ${LOG_FILE})"
        return 0
    fi
    cd "$SCRIPT_DIR"
    ${CMD} --daemon --pid-file "$PID_FILE" --log-file "$LOG_FILE"
    echo "Started with PID $(get_pid) (log: ${LOG_FILE})"
}

do_stop() {
    if ! is_running; then
        echo "Not running"
        rm -f "$PID_FILE"
        return 0
    fi
    pid=$(get_pid)
    echo "Stopping PID ${pid}..."
    kill "$pid" 2>/dev/null || true
    # Wait up to 10s for graceful shutdown
    for i in $(seq 1 20); do
        if ! kill -0 "$pid" 2>/dev/null; then
            echo "Stopped"
            rm -f "$PID_FILE"
            return 0
        fi
        sleep 0.5
    done
    echo "Force killing..."
    kill -9 "$pid" 2>/dev/null || true
    rm -f "$PID_FILE"
}

do_status() {
    if is_running; then
        pid=$(get_pid)
        port=$(grep -o 'YUNZHI_RECEIVER_PORT=[0-9]*' "${SCRIPT_DIR}/.env" 2>/dev/null | cut -d= -f2 || echo "9090")
        echo "Running: PID=${pid}, Log=${LOG_FILE}"
    else
        echo "Not running"
    fi
}

do_logs() {
    if [ -f "$LOG_FILE" ]; then
        tail -f "$LOG_FILE"
    else
        echo "No log file found at ${LOG_FILE}"
    fi
}

case "${1:-}" in
    start)   do_start    ;;
    stop)    do_stop     ;;
    restart) do_stop; sleep 1; do_start ;;
    status)  do_status   ;;
    logs)    do_logs     ;;
    *)       usage       ;;
esac
