#!/bin/bash
# telegrammer — Main CLI entry point for claude-code-telegrammer
# Runs Claude Code as an autonomous Telegram agent in a screen session.
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
LIB_DIR="${SCRIPT_DIR}/../lib"

# shellcheck source=../lib/common.sh
source "${LIB_DIR}/common.sh"
# shellcheck source=../lib/lock.sh
source "${LIB_DIR}/lock.sh"

# ── Defaults ──────────────────────────────────────────────────────────
CONFIG_FILE=""
SESSION_NAME="cld-telegram"
LOCK_PATH="${DEFAULT_LOCK_PATH}"
WORKDIR="${HOME}/proj"
AGENT_ID="telegram-master"
AGENT_ROLE="telegram"
WATCHDOG_ENABLED="true"
WATCHDOG_INTERVAL="1.5"
CHANNELS="plugin:telegram@claude-plugins-official"
EXTRA_FLAGS=""

# ── Usage ─────────────────────────────────────────────────────────────
usage() {
    cat <<'USAGE'
Usage: telegrammer <command> [OPTIONS]

Commands:
  start [config.yaml]   Start a Telegram agent in a screen session
  stop                  Stop the agent and release lock
  status                Show agent status
  attach                Attach to screen session
  logs                  Show recent screen output

Options:
  --session NAME        Screen session name (default: cld-telegram)
  --workdir PATH        Working directory (default: ~/proj)
  -h, --help            Show this help
USAGE
}

# ── Load config from YAML ─────────────────────────────────────────────
load_config() {
    local file="$1"
    if [[ ! -f "$file" ]]; then
        log_error "Config file not found: $file"
        return 1
    fi

    log_info "Loading config: $file"

    local val

    val=$(yaml_get "$file" "spec.screen.name" "$SESSION_NAME")
    SESSION_NAME="$val"

    val=$(yaml_get "$file" "spec.lock.path" "$LOCK_PATH")
    LOCK_PATH="$val"
    # Expand tilde
    LOCK_PATH="${LOCK_PATH/#\~/$HOME}"

    val=$(yaml_get "$file" "spec.workdir" "$WORKDIR")
    WORKDIR="$val"
    WORKDIR="${WORKDIR/#\~/$HOME}"

    val=$(yaml_get "$file" "spec.env.CLAUDE_AGENT_ID" "$AGENT_ID")
    AGENT_ID="$val"

    val=$(yaml_get "$file" "spec.env.CLAUDE_AGENT_ROLE" "$AGENT_ROLE")
    AGENT_ROLE="$val"

    val=$(yaml_get "$file" "spec.watchdog.enabled" "$WATCHDOG_ENABLED")
    WATCHDOG_ENABLED="$val"

    val=$(yaml_get "$file" "spec.watchdog.interval" "$WATCHDOG_INTERVAL")
    WATCHDOG_INTERVAL="$val"

    # Channels
    local channels_list
    channels_list=$(yaml_get_list "$file" "spec.channels")
    if [[ -n "$channels_list" ]]; then
        CHANNELS=$(echo "$channels_list" | head -1)
    fi

    # Extra flags
    local flags_list
    flags_list=$(yaml_get_list "$file" "spec.flags")
    if [[ -n "$flags_list" ]]; then
        EXTRA_FLAGS="$flags_list"
    fi
}

# ── Start ─────────────────────────────────────────────────────────────
cmd_start() {
    log_info "Starting telegrammer agent: $AGENT_ID"

    # Acquire lock
    if ! acquire_lock "$LOCK_PATH"; then
        log_error "Another instance is running. Use 'telegrammer stop' first."
        exit 1
    fi

    # Check if session already exists
    if screen_exists "$SESSION_NAME"; then
        log_error "Screen session '$SESSION_NAME' already exists"
        release_lock "$LOCK_PATH"
        exit 1
    fi

    ensure_dirs

    # Build claude command
    local claude_cmd="claude"
    claude_cmd+=" --channels ${CHANNELS}"

    # Add flags
    local flag
    while IFS= read -r flag; do
        [[ -z "$flag" ]] && continue
        claude_cmd+=" ${flag}"
    done <<< "$EXTRA_FLAGS"

    # Export environment
    export CLAUDE_AGENT_ROLE="$AGENT_ROLE"
    export CLAUDE_AGENT_ID="$AGENT_ID"

    # Start screen session with claude
    log_info "Starting screen session: $SESSION_NAME"
    log_info "Command: $claude_cmd"
    log_info "Workdir: $WORKDIR"

    screen -dmS "$SESSION_NAME" bash -c "
        export CLAUDE_AGENT_ROLE='${AGENT_ROLE}'
        export CLAUDE_AGENT_ID='${AGENT_ID}'
        cd '${WORKDIR}' && ${claude_cmd}
    "

    # Give screen a moment to start
    sleep 1

    if ! screen_exists "$SESSION_NAME"; then
        log_error "Failed to start screen session"
        release_lock "$LOCK_PATH"
        exit 1
    fi

    log_info "Claude session started in screen: $SESSION_NAME"

    # Start watchdog if enabled
    if [[ "$WATCHDOG_ENABLED" == "true" ]]; then
        log_info "Starting watchdog (interval=${WATCHDOG_INTERVAL}s)"
        screen -S "$SESSION_NAME" -X screen bash -c "
            export TELEGRAMMER_SESSION='${SESSION_NAME}'
            export TELEGRAMMER_WATCHDOG_INTERVAL='${WATCHDOG_INTERVAL}'
            '${SCRIPT_DIR}/telegrammer-watchdog' --session '${SESSION_NAME}' --interval '${WATCHDOG_INTERVAL}'
        "
        log_info "Watchdog started in screen window 1"
    fi

    log_info "Agent '$AGENT_ID' is running. Use 'telegrammer attach' to view."
}

# ── Stop ──────────────────────────────────────────────────────────────
cmd_stop() {
    log_info "Stopping telegrammer agent"

    if screen_exists "$SESSION_NAME"; then
        screen -S "$SESSION_NAME" -X quit 2>/dev/null || true
        log_info "Screen session '$SESSION_NAME' terminated"
    else
        log_warn "Screen session '$SESSION_NAME' not found"
    fi

    release_lock "$LOCK_PATH"
    log_info "Agent stopped"
}

# ── Status ────────────────────────────────────────────────────────────
cmd_status() {
    echo "=== Telegramer Status ==="
    echo "Session: $SESSION_NAME"
    echo "Agent ID: $AGENT_ID"

    if screen_exists "$SESSION_NAME"; then
        echo "Screen: RUNNING"
        local screen_line
        screen_line=$(screen -ls 2>/dev/null | grep "\.${SESSION_NAME}" | head -1)
        echo "  $screen_line"
    else
        echo "Screen: NOT RUNNING"
    fi

    local stale
    stale=$(check_stale "$LOCK_PATH")
    case "$stale" in
        no-lock)     echo "Lock: NONE" ;;
        active)      echo "Lock: ACTIVE (PID $(cat "$LOCK_PATH" 2>/dev/null))" ;;
        stale*)      echo "Lock: STALE (needs cleanup)" ;;
    esac
}

# ── Attach ────────────────────────────────────────────────────────────
cmd_attach() {
    if ! screen_exists "$SESSION_NAME"; then
        log_error "Screen session '$SESSION_NAME' not found"
        exit 1
    fi
    exec screen -r "$SESSION_NAME"
}

# ── Logs ──────────────────────────────────────────────────────────────
cmd_logs() {
    local capture_file="${TELEGRAMMER_CAPTURE_DIR}/capture-${SESSION_NAME}.txt"

    if screen_exists "$SESSION_NAME"; then
        screen_capture "$SESSION_NAME" "$capture_file" 2>/dev/null || true
    fi

    if [[ -f "$capture_file" ]]; then
        echo "=== Last screen capture ($capture_file) ==="
        cat "$capture_file"
    else
        log_warn "No capture file found. Is the agent running?"
    fi
}

# ── Main ──────────────────────────────────────────────────────────────
COMMAND=""

while [[ $# -gt 0 ]]; do
    case "$1" in
        start|stop|status|attach|logs)
            COMMAND="$1"; shift
            # Check for config file after start
            if [[ "$COMMAND" == "start" && $# -gt 0 && ! "$1" =~ ^-- ]]; then
                CONFIG_FILE="$1"; shift
            fi
            ;;
        --session)  SESSION_NAME="$2"; shift 2 ;;
        --workdir)  WORKDIR="$2"; shift 2 ;;
        -h|--help)  usage; exit 0 ;;
        *)          log_error "Unknown option: $1"; usage; exit 1 ;;
    esac
done

if [[ -z "$COMMAND" ]]; then
    usage
    exit 1
fi

# Load config if provided
if [[ -n "$CONFIG_FILE" ]]; then
    load_config "$CONFIG_FILE"
fi

# Dispatch
case "$COMMAND" in
    start)  cmd_start ;;
    stop)   cmd_stop ;;
    status) cmd_status ;;
    attach) cmd_attach ;;
    logs)   cmd_logs ;;
esac
