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

usage() {
  printf 'usage: %s snapshot <source-db> <destination-db> <completed-adw-id> <red-quality-adw-id>\n' "$0" >&2
  printf '       %s serve <snapshot-db> [collector-port] [web-port]\n' "$0" >&2
  exit 64
}

snapshot() {
  local source_db=$1 destination_db=$2 completed_id=$3 red_id=$4
  [[ $completed_id =~ ^[[:alnum:]_-]+$ && $red_id =~ ^[[:alnum:]_-]+$ ]] || { printf 'invalid canary run id\n' >&2; exit 64; }
  local destination_dir
  destination_dir=$(dirname "$destination_db")
  mkdir -p "$destination_dir"
  rm -f "$destination_db"
  local completed_count red_count
  completed_count=$(sqlite3 "$source_db" "SELECT COUNT(1) FROM sessions WHERE adw_id = '$completed_id' AND ended_at IS NOT NULL;")
  red_count=$(sqlite3 "$source_db" "SELECT COUNT(1) FROM sessions AS s WHERE s.adw_id = '$red_id' AND s.ended_at IS NOT NULL AND EXISTS (SELECT 1 FROM gate_results AS g WHERE g.adw_id = s.adw_id AND g.gate LIKE 'quality:%' AND g.passed = 0);")
  [[ $completed_count == 1 ]] || { printf 'completed run not found or unfinished: %s\n' "$completed_id" >&2; exit 65; }
  [[ $red_count == 1 ]] || { printf 'red quality run not found: %s\n' "$red_id" >&2; exit 65; }
  sqlite3 "$source_db" ".backup '$destination_db'"
  sqlite3 "$destination_db" <<SQL
PRAGMA foreign_keys = OFF;
CREATE TEMP TABLE canary_ids(adw_id TEXT PRIMARY KEY);
INSERT INTO canary_ids VALUES ('$completed_id'), ('$red_id');
DELETE FROM tool_calls WHERE attempt_id NOT IN (SELECT attempt_id FROM agent_attempts WHERE adw_id IN (SELECT adw_id FROM canary_ids));
DELETE FROM agent_attempts WHERE adw_id NOT IN (SELECT adw_id FROM canary_ids);
DELETE FROM agent_sessions WHERE adw_id NOT IN (SELECT adw_id FROM canary_ids);
DELETE FROM decisions WHERE adw_id NOT IN (SELECT adw_id FROM canary_ids);
DELETE FROM envelopes WHERE adw_id NOT IN (SELECT adw_id FROM canary_ids);
DELETE FROM events WHERE adw_id NOT IN (SELECT adw_id FROM canary_ids);
DELETE FROM gate_results WHERE adw_id NOT IN (SELECT adw_id FROM canary_ids);
DELETE FROM phase_diffs WHERE adw_id NOT IN (SELECT adw_id FROM canary_ids);
DELETE FROM processes WHERE adw_id NOT IN (SELECT adw_id FROM canary_ids);
DELETE FROM phases WHERE adw_id NOT IN (SELECT adw_id FROM canary_ids);
DELETE FROM sessions WHERE adw_id NOT IN (SELECT adw_id FROM canary_ids);
VACUUM;
SQL
  local sessions red_gates diffs tools
  sessions=$(sqlite3 "$destination_db" "SELECT COUNT(1) FROM sessions;")
  red_gates=$(sqlite3 "$destination_db" "SELECT COUNT(1) FROM gate_results WHERE adw_id = '$red_id' AND gate LIKE 'quality:%' AND passed = 0;")
  diffs=$(sqlite3 "$destination_db" "SELECT COUNT(1) FROM phase_diffs;")
  tools=$(sqlite3 "$destination_db" "SELECT COUNT(1) FROM tool_calls;")
  [[ $sessions == 2 && $red_gates -gt 0 && $diffs -gt 0 && $tools -gt 0 ]] || { printf 'snapshot validation failed\n' >&2; exit 65; }
  printf 'snapshot ready: sessions=%s red_quality=%s diffs=%s tools=%s\n' "$sessions" "$red_gates" "$diffs" "$tools"
}

serve() {
  local snapshot_db=$1 collector_port=${2:-14980} web_port=${3:-4331}
  [[ -f $snapshot_db ]] || { printf 'snapshot missing: %s\n' "$snapshot_db" >&2; exit 66; }
  snapshot_db=$(cd "$(dirname "$snapshot_db")" && pwd)/$(basename "$snapshot_db")
  local config_dir collector_pid=
  config_dir=$(mktemp -d)
  cleanup() {
    [[ -n $collector_pid ]] && kill "$collector_pid" 2>/dev/null || true
    wait "$collector_pid" 2>/dev/null || true
    rm -rf "$config_dir"
  }
  trap cleanup EXIT INT TERM
  cat >"$config_dir/config.toml" <<TOML
bindHost = "127.0.0.1"
port = $collector_port
[adapters.harness]
enabled = false
[adapters.systray-ai]
enabled = false
[adapters.agent-sessions]
enabled = false
[adapters.ghci]
enabled = false
[adapters.prometheus]
enabled = false
[adapters.kubernetes]
enabled = false
[adapters.golive]
enabled = false
[adapters.cluster]
enabled = false
[adapters.gates]
enabled = false
[adapters.botmaster]
enabled = false
[adapters.offload]
enabled = false
[adapters.factory]
dbPath = "$snapshot_db"
intervalMs = 250
[adapters.sessions]
enabled = false
[adapters.sandbox-toolgap]
enabled = false
TOML
  OVERDECK_CONFIG_DIR="$config_dir" bun run --cwd "$PWD/collector" start >"$config_dir/collector.log" 2>&1 &
  collector_pid=$!
  for _ in $(seq 1 100); do
    [[ -f $config_dir/token ]] && break
    sleep 0.1
  done
  [[ -f $config_dir/token ]] || { printf 'collector did not create token\n' >&2; exit 67; }
  COLLECTOR_URL="http://127.0.0.1:$collector_port" COLLECTOR_TOKEN=$(<"$config_dir/token") pnpm --filter web exec astro dev --host 127.0.0.1 --port "$web_port"
}

[[ $# -ge 1 ]] || usage
case $1 in
  snapshot) [[ $# == 5 ]] || usage; snapshot "$2" "$3" "$4" "$5" ;;
  serve) [[ $# -ge 2 && $# -le 4 ]] || usage; serve "${2}" "${3:-}" "${4:-}" ;;
  *) usage ;;
esac
