#!/usr/bin/env bash
set -u

repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$repo_root" || exit 1

if [[ "${1:-}" == "--json" ]]; then
  exec node ai/runtime/dist/cli.js doctor --json
fi

if [[ "${1:-}" == "--kv" ]]; then
  exec node ai/runtime/dist/cli.js scorecard --json
fi

if [[ "${1:-}" == "--timings" ]]; then
  ai/tools/runtime-scorecard/scorecard.sh --json | node -e "
let input = '';
process.stdin.on('data', (chunk) => input += chunk);
process.stdin.on('end', () => {
  const card = JSON.parse(input);
  const timings = card.timings || {};
  console.log('Runtime Scorecard Timings');
  Object.keys(timings).sort().forEach((key) => {
    console.log(key + '=' + timings[key]);
  });
  const slow = Object.entries(timings)
    .filter(([key, value]) => key !== 'total_ms' && Number(value) >= 1000)
    .sort((a, b) => Number(b[1]) - Number(a[1]));
  if (slow.length > 0) {
    console.log('');
    console.log('Slow sections:');
    slow.forEach(([key, value]) => console.log('- ' + key + ': ' + value + 'ms'));
  }
});
"
  exit 0
fi

case "${1:-}" in
  --governance)
    exec node ai/runtime/dist/cli.js governance validate --json "${@:2}"
    ;;
  --operator-surface)
    exec node ai/runtime/dist/cli.js telegram operator-surface --json
    ;;
  --approval-policy)
    exec ai/governance/validators/validate-approval-policy.sh "${@:2}"
    ;;
  --chunk-lifecycle)
    exec ai/governance/validators/validate-chunk-lifecycle.sh "${@:2}"
    ;;
  --summary-schema)
    exec ai/governance/validators/validate-summary.sh "${@:2}"
    ;;
  --validation-matrix)
    exec node ai/runtime/dist/cli.js validation-matrix --dry-run --json "${@:2}"
    ;;
esac

section() {
  printf '\n== %s ==\n' "$1"
}

run_advisory() {
  printf '\n$ %s\n' "$*"
  "$@" || printf 'WARN: command failed: %s\n' "$*"
}

daemon_request() {
  local action="$1"
  shift
  local output request_id

  printf '\n$ ai/tools/operator-daemon/request-action.sh --action %s' "$action"
  if (($# > 0)); then
    printf ' %q' "$@"
  fi
  printf '\n'

  output="$(ai/tools/operator-daemon/request-action.sh --action "$action" "$@" 2>&1)"
  printf '%s\n' "$output"
  request_id="$(printf '%s\n' "$output" | awk -F': ' '$1 == "Request id" { print $2; exit }')"
  if [[ -z "$request_id" ]]; then
    printf 'WARN: could not parse daemon request id for %s\n' "$action"
    return 0
  fi

  printf '\n$ ai/tools/operator-daemon/wait-result.sh %s --timeout 12\n' "$request_id"
  if ! ai/tools/operator-daemon/wait-result.sh "$request_id" --timeout 12; then
    printf 'WARN: daemon did not return %s within timeout; check trusted runtime\n' "$action"
  fi
}

daemon_running() {
  local kv
  kv="$(ai/tools/operator-daemon/status.sh --kv 2>/dev/null || true)"
  printf '%s\n' "$kv" | grep -q '^status=.*running'
}

section "Blueprint AI Runtime Doctor"
printf 'Repo: %s\n' "$repo_root"
printf 'Date: %s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')"
printf 'JSON: node ai/runtime/dist/cli.js doctor --json\n'
printf 'Timings: node ai/runtime/dist/cli.js validate --tier fast\n'

section "Git"
run_advisory git branch --show-current
run_advisory git status --short --untracked-files=all

section "TRUSTED STATUS: Daemon"
run_advisory ai/tools/operator-daemon/status.sh

section "TRUSTED STATUS: Runtime Via Daemon"
if daemon_running; then
  daemon_request local_dev_status
  printf '\nINFO: dev-server and Telegram trusted status are included in local_dev_status.\n'
  printf 'INFO: skipped separate dev_server_status and telegram_bridge_status daemon requests to avoid duplicate daemon polling latency.\n'
else
  printf 'WARN: trusted daemon heartbeat is stale; skipping daemon runtime requests.\n'
  printf 'Recovery: restart ai/tools/operator-daemon/start-daemon.sh from the trusted local operator shell/tmux.\n'
fi

section "TRUSTED STATUS: Operator Questions"
run_advisory ai/tools/operator-questions/status.sh
run_advisory ai/tools/operator-questions/consume-pending.sh --dry-run
run_advisory ai/tools/operator-questions/list-approved-actions.sh

section "TRUSTED STATUS: Approved Action Dispatcher"
run_advisory ai/tools/approved-action-dispatcher/status.sh
run_advisory ai/tools/action-timeline/list.sh --limit 8

section "TRUSTED STATUS: Missing Actions"
run_advisory ai/tools/missing-actions/summary.sh

section "GOVERNANCE"
run_advisory ai/governance/validate-schemas.sh
run_advisory ai/governance/validate-registries.sh
run_advisory node ai/runtime/dist/cli.js validation-matrix --dry-run --json
printf 'Full governance validator: node ai/runtime/dist/cli.js governance validate --json\n'

section "ADVISORY: Local/Sandbox Probes"
printf 'These probes run in the current command context. If they disagree with daemon results, trust the daemon.\n'
run_advisory ai/tools/local-dev/status.sh

if command -v curl >/dev/null 2>&1; then
  printf '\n$ curl frontend health\n'
  curl --max-time 3 -s -o /dev/null -w 'frontend_http_status=%{http_code}\n' http://127.0.0.1:4220/ || printf 'WARN: frontend curl failed\n'

  printf '\n$ curl backend GraphQL health\n'
  curl --max-time 3 -s -o /dev/null -w 'backend_graphql_http_status=%{http_code}\n' \
    -H 'content-type: application/json' \
    --data '{"query":"query Health { health }"}' \
    http://127.0.0.1:3720/graphql || printf 'WARN: backend GraphQL curl failed\n'
else
  printf 'WARN: curl unavailable\n'
fi

run_advisory ai/tools/runtime-scorecard/playwright-probe.sh

section "Summary"
printf 'Use daemon results as authoritative for tmux/dev-server/Telegram runtime state.\n'
printf 'Use advisory probes only to diagnose the current shell/sandbox context.\n'
printf 'Machine-readable scorecard: node ai/runtime/dist/cli.js scorecard --json\n'
printf 'Pending questions: ai/tools/operator-questions/list.sh --pending\n'
printf 'Approved unexecuted actions: ai/tools/operator-questions/list-approved-actions.sh\n'
printf 'Dispatch approved actions: ai/tools/approved-action-dispatcher/dispatch.sh --dry-run --once\n'
printf 'Action timeline: ai/tools/action-timeline/list.sh\n'
printf 'Missing-action summary: ai/tools/missing-actions/summary.sh\n'
