#!/usr/bin/env bash
set -euo pipefail

script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=ai/tools/codex-io-bridge/lib.sh
source "$script_dir/lib.sh"
cio_init

mode="text"
case "${1:-}" in
  --kv) mode="kv" ;;
  --json) mode="json" ;;
  "" ) ;;
  -h | --help)
    echo "Usage: ai/tools/codex-io-bridge/status.sh [--kv|--json]"
    exit 0
    ;;
  *) echo "codex io status error: unknown argument: $1" >&2; exit 2 ;;
esac

running=false
target_available=false
now="$(date +%s)"
heartbeat_age="unknown"
last_progress_age="unknown"
state="unknown"
current_question_id=""
message=""
stuck=false
stuck_reason=""
if command -v tmux >/dev/null 2>&1 && tmux has-session -t "$CIO_SESSION" >/dev/null 2>&1; then
  running=true
fi
if command -v tmux >/dev/null 2>&1 && cio_tmux_has_target; then
  target_available=true
fi
if [[ -f "$CIO_HEARTBEAT_FILE" ]]; then
  heartbeat_at="$(cat "$CIO_HEARTBEAT_FILE" 2>/dev/null || true)"
  if [[ "$heartbeat_at" =~ ^[0-9]+$ ]]; then
    heartbeat_age="$((now - heartbeat_at))"
  fi
fi
if [[ -f "$CIO_PROGRESS_FILE" ]]; then
  # shellcheck disable=SC1090
  source "$CIO_PROGRESS_FILE"
  if [[ "${last_progress_at:-}" =~ ^[0-9]+$ ]]; then
    last_progress_age="$((now - last_progress_at))"
  fi
fi
if [[ "$running" == "true" && "$heartbeat_age" =~ ^[0-9]+$ && "$heartbeat_age" -gt "${CIO_HEARTBEAT_STALE_SECONDS:-15}" ]]; then
  stuck=true
  stuck_reason="heartbeat_stale"
fi
if [[ -n "${current_question_id:-}" && -f "$CIO_REPO_ROOT/.tmp/operator-questions/resolved/$current_question_id.env" && ! -f "$CIO_REPO_ROOT/.tmp/operator-questions/answers/$current_question_id.env" ]]; then
  stuck=true
  stuck_reason="waiting_on_resolved_question"
fi
status="$([[ "$running" == "true" ]] && printf running || printf 'not running')"
if [[ "$stuck" == "true" ]]; then
  status="degraded"
fi

if [[ "$mode" == "kv" ]]; then
  printf 'state_dir=%q\n' "$CIO_STATE_DIR"
  printf 'session=%q\n' "$CIO_SESSION"
  printf 'target=%q\n' "$CIO_TARGET"
  printf 'running=%s\n' "$running"
  printf 'status=%q\n' "$status"
  printf 'target_available=%s\n' "$target_available"
  printf 'target_status=%q\n' "$([[ "$target_available" == "true" ]] && printf available || printf unavailable)"
  printf 'heartbeat_age_seconds=%q\n' "$heartbeat_age"
  printf 'last_progress_age_seconds=%q\n' "$last_progress_age"
  printf 'state=%q\n' "${state:-unknown}"
  printf 'current_question_id=%q\n' "${current_question_id:-}"
  printf 'stuck=%s\n' "$stuck"
  printf 'stuck_reason=%q\n' "$stuck_reason"
  exit 0
fi

if [[ "$mode" == "json" ]]; then
  node - "$CIO_STATE_DIR" "$CIO_SESSION" "$CIO_TARGET" "$running" "$status" "$target_available" "$heartbeat_age" "$last_progress_age" "${state:-unknown}" "${current_question_id:-}" "$stuck" "$stuck_reason" "${message:-}" <<'NODE'
const [
  stateDir,
  session,
  target,
  running,
  status,
  targetAvailable,
  heartbeatAge,
  lastProgressAge,
  state,
  currentQuestionId,
  stuck,
  stuckReason,
  message,
] = process.argv.slice(2);
const age = (value) => /^\d+$/.test(value) ? Number(value) : null;
console.log(JSON.stringify({
  state_dir: stateDir,
  session,
  target,
  running: running === 'true',
  status,
  target_available: targetAvailable === 'true',
  target_status: targetAvailable === 'true' ? 'available' : 'unavailable',
  heartbeat_age_seconds: age(heartbeatAge),
  last_progress_age_seconds: age(lastProgressAge),
  state,
  current_question_id: currentQuestionId,
  stuck: stuck === 'true',
  stuck_reason: stuckReason,
  message,
}, null, 2));
NODE
  exit 0
fi

printf 'Codex I/O Bridge\n'
printf 'State dir: %s\n' "$CIO_STATE_DIR"
printf 'Session: %s\n' "$CIO_SESSION"
printf 'Target: %s\n' "$CIO_TARGET"
printf 'Status: %s\n' "$status"
if [[ "$target_available" == "true" ]]; then
  printf 'Target status: available\n'
else
  printf 'Target status: unavailable\n'
fi
printf 'Heartbeat age seconds: %s\n' "$heartbeat_age"
printf 'Last progress age seconds: %s\n' "$last_progress_age"
printf 'State: %s\n' "${state:-unknown}"
[[ -z "${current_question_id:-}" ]] || printf 'Current wait question: %s\n' "$current_question_id"
if [[ "$stuck" == "true" ]]; then
  printf 'Stuck: true (%s)\n' "$stuck_reason"
else
  printf 'Stuck: false\n'
fi
