#!/bin/bash
# telegrammer-hook — Entry point for scitex-agent-container hooks
# Called by agent-container's post_start/pre_stop hooks.
#
# Usage:
#   telegrammer-hook pre-start     # Write access.json (before Claude Code)
#   telegrammer-hook post-start    # Start watchdog + send startup commands
#   telegrammer-hook pre-stop      # Stop watchdog

set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
source "$SCRIPT_DIR/lib/common.sh"

# Expect these env vars from agent-container:
#   AGENT_CONFIG_PATH  — full path to agent YAML
#   AGENT_SCREEN_NAME  — screen session name
#   AGENT_NAME         — agent name

cmd="${1:-}"

case "$cmd" in
  pre-start)
    if [[ -z "${AGENT_CONFIG_PATH:-}" ]]; then
      log_warn "AGENT_CONFIG_PATH not set, skipping pre-start"
      exit 0
    fi

    # 1. Map bot_token_env → TELEGRAM_BOT_TOKEN
    BOT_TOKEN_ENV=$(yaml_get "$AGENT_CONFIG_PATH" "spec.telegram.bot_token_env" "")
    if [[ -n "$BOT_TOKEN_ENV" && "$BOT_TOKEN_ENV" != "TELEGRAM_BOT_TOKEN" ]]; then
      TOKEN_VAL="${!BOT_TOKEN_ENV:-}"
      if [[ -n "$TOKEN_VAL" ]]; then
        export TELEGRAM_BOT_TOKEN="$TOKEN_VAL"
      fi
    fi

    # 2. Write access.json
    AUTO_CONNECT=$(yaml_get "$AGENT_CONFIG_PATH" "spec.telegram.auto_connect" "true")
    STATE_DIR="${TELEGRAM_STATE_DIR:-$HOME/.scitex/agent-container/telegram}"

    # Resolve bot_id from token for state dir
    if [[ -n "${TELEGRAM_BOT_TOKEN:-}" ]]; then
      BOT_ID="${TELEGRAM_BOT_TOKEN%%:*}"
      STATE_DIR="$HOME/.scitex/agent-container/telegram/$BOT_ID"
    fi
    mkdir -p "$STATE_DIR"

    # Parse allowed_users via Python (yaml_get returns flat values, not JSON)
    if [[ "$AUTO_CONNECT" == "true" || "$AUTO_CONNECT" == "True" ]]; then
      python3 -c "
import yaml, json
with open('$AGENT_CONFIG_PATH') as f:
    raw = yaml.safe_load(f)
users = raw.get('spec',{}).get('telegram',{}).get('allowed_users',[]) or []
users = [str(u) for u in users]
data = {'dmPolicy': 'allowlist', 'allowFrom': users}
with open('$STATE_DIR/access.json', 'w') as f:
    json.dump(data, f, indent=2)
    f.write('\n')
print('Wrote access.json with', len(users), 'allowed users to $STATE_DIR')
"
    fi

    # 3. Write .env for the MCP server
    echo "TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN:-}" > "$STATE_DIR/.env"
    chmod 600 "$STATE_DIR/.env"
    log_info "Wrote .env to $STATE_DIR"

    # 4. Write MCP config JSON for --mcp-config
    AGENT_NAME="${AGENT_NAME:-telegrammer}"
    MCP_DIR="/tmp/scitex-agent-container"
    mkdir -p "$MCP_DIR"
    # Find telegram-server.ts: check project root first, then relative to SCRIPT_DIR
    TS_SERVER=""
    for candidate in \
      "$SCRIPT_DIR/../ts/telegram-server.ts" \
      "$SCRIPT_DIR/ts/telegram-server.ts" \
      "$(python3 -c 'import claude_code_telegrammer; import os; print(os.path.join(os.path.dirname(claude_code_telegrammer.__file__), "..", "..", "ts", "telegram-server.ts"))' 2>/dev/null)" \
    ; do
      if [[ -f "$candidate" ]]; then
        TS_SERVER="$(cd "$(dirname "$candidate")" && pwd)/$(basename "$candidate")"
        break
      fi
    done
    if [[ -z "$TS_SERVER" ]]; then
      log_warn "telegram-server.ts not found"
      exit 1
    fi

    python3 -c "
import yaml, json, os
with open('$AGENT_CONFIG_PATH') as f:
    raw = yaml.safe_load(f)
users = raw.get('spec',{}).get('telegram',{}).get('allowed_users',[]) or []
users_str = ','.join(str(u) for u in users)
config = {
    'mcpServers': {
        'telegram': {
            'type': 'stdio',
            'command': 'bun',
            'args': ['run', '$TS_SERVER'],
            'env': {
                'TELEGRAM_BOT_TOKEN': os.environ.get('TELEGRAM_BOT_TOKEN', ''),
                'TELEGRAM_STATE_DIR': '$STATE_DIR',
                'TELEGRAM_ALLOWED_USERS': users_str
            }
        }
    }
}
# Write to both /tmp (for --mcp-config) and workdir .mcp.json (for --dangerously-load-development-channels)
path = '$MCP_DIR/mcp-$AGENT_NAME.json'
with open(path, 'w') as f:
    json.dump(config, f, indent=2)
    f.write('\n')
print('Wrote MCP config to', path)

# Also write to workdir .mcp.json so --dangerously-load-development-channels can find it
import yaml as _yaml
with open('$AGENT_CONFIG_PATH') as f:
    agent_cfg = _yaml.safe_load(f)
workdir = os.path.expanduser(agent_cfg.get('spec', {}).get('workdir', '~/proj'))
mcp_json_path = os.path.join(workdir, '.mcp.json')
# Merge with existing .mcp.json if present
existing = {}
try:
    with open(mcp_json_path) as f:
        existing = json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
    pass
existing.setdefault('mcpServers', {})
existing['mcpServers']['telegram'] = config['mcpServers']['telegram']
with open(mcp_json_path, 'w') as f:
    json.dump(existing, f, indent=2)
    f.write('\n')
print('Wrote .mcp.json to', mcp_json_path)
"
    ;;

  post-start)
    # Send startup commands (screen must exist)
    SESSION="${AGENT_SCREEN_NAME:-cld-telegram}"
    if [[ -n "${AGENT_CONFIG_PATH:-}" ]]; then
      telegrammer-init --session "$SESSION" --config "$AGENT_CONFIG_PATH"
    fi

    # Start watchdog if enabled
    if [[ -n "${AGENT_CONFIG_PATH:-}" ]]; then
      WATCHDOG_ENABLED=$(yaml_get "$AGENT_CONFIG_PATH" "spec.watchdog.enabled" "false")
      if [[ "$WATCHDOG_ENABLED" == "true" || "$WATCHDOG_ENABLED" == "True" ]]; then
        INTERVAL=$(yaml_get "$AGENT_CONFIG_PATH" "spec.watchdog.interval" "1.5")
        RESP_YN=$(yaml_get "$AGENT_CONFIG_PATH" "spec.watchdog.responses.y_n" "1")
        RESP_YYN=$(yaml_get "$AGENT_CONFIG_PATH" "spec.watchdog.responses.y_y_n" "2")
        RESP_WAIT=$(yaml_get "$AGENT_CONFIG_PATH" "spec.watchdog.responses.waiting" "/speak-and-call")

        WATCHDOG_SESSION="${SESSION}-watchdog"

        export TELEGRAMMER_SESSION="$SESSION"
        export TELEGRAMMER_WATCHDOG_INTERVAL="$INTERVAL"
        export TELEGRAMMER_RESP_Y_N="$RESP_YN"
        export TELEGRAMMER_RESP_Y_Y_N="$RESP_YYN"
        export TELEGRAMMER_RESP_WAITING="$RESP_WAIT"

        WATCHDOG_BIN=$(which telegrammer-watchdog 2>/dev/null || echo "")
        if [[ -n "$WATCHDOG_BIN" ]]; then
          screen -dmS "$WATCHDOG_SESSION" bash -c "$WATCHDOG_BIN --session $SESSION --interval $INTERVAL"
          log_info "Watchdog started: $WATCHDOG_SESSION"
        else
          log_warn "telegrammer-watchdog not found in PATH"
        fi
      fi
    fi
    ;;

  pre-stop)
    SESSION="${AGENT_SCREEN_NAME:-cld-telegram}"
    WATCHDOG_SESSION="${SESSION}-watchdog"
    if screen -ls 2>/dev/null | grep -q "$WATCHDOG_SESSION"; then
      screen -S "$WATCHDOG_SESSION" -X quit 2>/dev/null || true
      log_info "Watchdog stopped: $WATCHDOG_SESSION"
    fi
    ;;

  *)
    echo "Usage: telegrammer-hook {post-start|pre-stop}"
    exit 1
    ;;
esac
