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

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
WRAPPER="$ROOT/wrappers/na.sh"
PASS=0
FAIL=0

ok() { PASS=$((PASS+1)); printf '  ok   %s\n' "$1"; }
bad() { FAIL=$((FAIL+1)); printf '  FAIL %s\n     %s\n' "$1" "$2"; }

TMPDIR_ROOT="$(mktemp -d "/tmp/na-session-XXXX")"
MOCK_BIN="$TMPDIR_ROOT/bin"
mkdir -p "$MOCK_BIN"
CLAUDE_ARGS_LOG="$TMPDIR_ROOT/claude-args.log"
CLAUDE_STDOUT="$TMPDIR_ROOT/claude-stdout.log"
NORTH_ENV_FILE="$TMPDIR_ROOT/NORTH.env"
CCR_UP_BIN="$TMPDIR_ROOT/ccr-up.sh"

cleanup() {
  local rc=$?
  rm -rf "$TMPDIR_ROOT"
  exit "$rc"
}
trap cleanup EXIT

cat > "$MOCK_BIN/claude" <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' "$*" >> "${CLAUDE_ARGS_LOG:?}"
printf '%s\n' "${MOCK_CLAUDE_OUTPUT:-{\"ok\":true}}" >> "${CLAUDE_STDOUT:?}"
printf '%s\n' "${MOCK_CLAUDE_OUTPUT:-{\"ok\":true}}"
exit "${MOCK_EXIT_CODE:-0}"
EOF
chmod +x "$MOCK_BIN/claude"

cat > "$NORTH_ENV_FILE" <<'EOF'
export ANTHROPIC_BASE_URL="${ANTHROPIC_BASE_URL:-http://127.0.0.1:3456}"
EOF

cat > "$CCR_UP_BIN" <<'EOF'
#!/usr/bin/env bash
printf '%s\n' '{"up":true,"detail":"mock ccr up"}'
EOF
chmod +x "$CCR_UP_BIN"

mkworkspace() {
  mktemp -d "/tmp/na-workspace-XXXX"
}

run_wrapper() {
  local workspace="$1"
  shift
  CLAUDE_ARGS_LOG="$CLAUDE_ARGS_LOG" \
  CLAUDE_STDOUT="$CLAUDE_STDOUT" \
  MOCK_CLAUDE_OUTPUT='{"type":"result","subtype":"success"}' \
  PATH="$MOCK_BIN:$PATH" \
  _NA_NORTH_ENV="$NORTH_ENV_FILE" \
  _NA_CCR_UP_BIN="$CCR_UP_BIN" \
  HOME="$TMPDIR_ROOT/home" \
  "$WRAPPER" "$@"
}

assert_contains() {
  local haystack="$1"
  local needle="$2"
  local label="$3"
  if [[ "$haystack" == *"$needle"* ]]; then
    ok "$label"
  else
    bad "$label" "missing [$needle] in [$haystack]"
  fi
}

assert_not_contains() {
  local haystack="$1"
  local needle="$2"
  local label="$3"
  if [[ "$haystack" == *"$needle"* ]]; then
    bad "$label" "unexpected [$needle] in [$haystack]"
  else
    ok "$label"
  fi
}

test_dispatch_default_json() {
  : > "$CLAUDE_ARGS_LOG"
  : > "$CLAUDE_STDOUT"
  local workspace out args
  workspace="$(mkworkspace)"
  out="$(run_wrapper "$workspace" --workspace "$workspace" --trust "do work" --task-slug "plain")"
  args="$(tail -n 1 "$CLAUDE_ARGS_LOG")"

  assert_contains "$args" "--output-format json" "default dispatch uses json output"
  assert_not_contains "$args" "--session-id" "default dispatch omits session id"
  assert_not_contains "$args" "stream-json" "default dispatch does not stream"
  assert_contains "$out" "workspace: $workspace" "default dispatch prints workspace header"
  rm -rf "$workspace"
}

test_dispatch_session_continuity() {
  : > "$CLAUDE_ARGS_LOG"
  : > "$CLAUDE_STDOUT"
  local workspace out args session_id
  session_id="11111111-1111-4111-8111-111111111111"
  workspace="$(mkworkspace)"
  out="$(run_wrapper "$workspace" --workspace "$workspace" --trust "resume work" --task-slug "resume" --session-id "$session_id")"
  args="$(tail -n 1 "$CLAUDE_ARGS_LOG")"

  assert_contains "$args" "--session-id $session_id" "continuity forwards session id"
  assert_contains "$args" "--output-format stream-json" "continuity flips to stream-json"
  assert_contains "$out" "session_id: $session_id" "continuity prints session id status line"
  rm -rf "$workspace"
}

test_interactive_is_fail_closed() {
  local out rc
  if out="$(PATH="$MOCK_BIN:$PATH" _NA_NORTH_ENV="$NORTH_ENV_FILE" _NA_CCR_UP_BIN="$CCR_UP_BIN" HOME="$TMPDIR_ROOT/home" "$WRAPPER" --interactive 2>&1)"; then
    rc=0
  else
    rc=$?
  fi

  if [[ "$rc" -eq 2 ]]; then
    ok "interactive mode exits 2"
  else
    bad "interactive mode exits 2" "rc=$rc out=$out"
  fi
  assert_contains "$out" "--interactive is not supported" "interactive mode explains rejection"
}

test_health_and_list_models() {
  local health_json models_json health_out models_out
  health_json="$TMPDIR_ROOT/health.json"
  models_json="$TMPDIR_ROOT/models.json"
  printf '%s\n' '{"ok": true, "service": "ccr"}' > "$health_json"
  printf '%s\n' '{"data": [{"id": "cohere/north-mini-code:free"}]}' > "$models_json"

  health_out="$(_NA_HEALTH_URL="file://$health_json" PATH="$MOCK_BIN:$PATH" _NA_NORTH_ENV="$NORTH_ENV_FILE" _NA_CCR_UP_BIN="$CCR_UP_BIN" HOME="$TMPDIR_ROOT/home" "$WRAPPER" --health)"
  models_out="$(_NA_MODELS_URL="file://$models_json" PATH="$MOCK_BIN:$PATH" _NA_NORTH_ENV="$NORTH_ENV_FILE" _NA_CCR_UP_BIN="$CCR_UP_BIN" HOME="$TMPDIR_ROOT/home" "$WRAPPER" --list-models)"

  assert_contains "$health_out" '"service": "ccr"' "health mode returns proxy health payload"
  assert_contains "$models_out" '"id": "cohere/north-mini-code:free"' "list-models returns model payload"
}

echo "na session:"
test_dispatch_default_json
test_dispatch_session_continuity
test_interactive_is_fail_closed
test_health_and_list_models
echo
echo "PASS=$PASS FAIL=$FAIL"
[[ "$FAIL" -eq 0 ]]
