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

tmp_dir="$(mktemp -d)"
cleanup() {
  rm -rf "$tmp_dir"
}
trap cleanup EXIT

repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
agentrail="${repo_dir}/scripts/agentrail"

assert_grep() {
  local pattern="$1"
  local file="$2"
  local message="$3"

  if ! grep -q -- "$pattern" "$file"; then
    echo "$message" >&2
    echo "--- output ---" >&2
    cat "$file" >&2
    exit 1
  fi
}

target="${tmp_dir}/target"
mkdir -p "$target/.agentrail"
cat >"${target}/.agentrail/state.json" <<'JSON'
{
  "agentrailVersion": "0.1.0",
  "installedAt": "2026-05-26T10:00:00Z",
  "updatedAt": "2026-05-26T11:00:00Z",
  "legacyAdopted": false,
  "workflow": {
    "phase": "implementation",
    "activePhase": "execute",
    "activeIssue": 13,
    "activePullRequest": 23,
    "activePrd": "docs/prd/agentrail.md",
    "activeMilestone": "docs/milestones/001-agentrail.md",
    "activeRun": {
      "runId": "20260526-110000-issue-13-codex-100",
      "targetType": "issue",
      "targetIssue": 13,
      "agent": "codex",
      "status": "running",
      "pickedAt": "2026-05-26T11:00:00Z",
      "promptFile": ".agentrail/runs/20260526-110000-issue-13-codex-100/prompt.md",
      "metadataFile": ".agentrail/runs/20260526-110000-issue-13-codex-100/run.json",
      "runDir": ".agentrail/runs/20260526-110000-issue-13-codex-100",
      "contextPackFile": ".agentrail/context/packs/issue-13-execute-20260526T110000000Z.json"
    },
    "completedRuns": [
      {
        "runId": "20260526-100000-issue-8-codex-99",
        "targetType": "issue",
        "targetIssue": 8,
        "agent": "codex",
        "status": "completed",
        "executionAttempt": 2,
        "maxExecutionAttempts": 5,
        "failedVerificationAttempts": 1,
        "pickedAt": "2026-05-26T10:00:00Z",
        "completedAt": "2026-05-26T10:20:00Z",
        "promptFile": ".agentrail/runs/20260526-100000-issue-8-codex-99/prompt.md",
        "metadataFile": ".agentrail/runs/20260526-100000-issue-8-codex-99/run.json"
      },
      {
        "runId": "20260526-103000-issue-9-codex-98",
        "targetType": "issue",
        "targetIssue": 9,
        "agent": "codex",
        "status": "failed",
        "activePhase": "verify",
        "executionAttempt": 5,
        "maxExecutionAttempts": 5,
        "failedVerificationAttempts": 5,
        "blockedReason": "maximum verifier retry attempts reached after 5 execution attempts",
        "pickedAt": "2026-05-26T10:30:00Z",
        "completedAt": "2026-05-26T10:50:00Z",
        "promptFile": ".agentrail/runs/20260526-103000-issue-9-codex-98/prompt.md",
        "metadataFile": ".agentrail/runs/20260526-103000-issue-9-codex-98/run.json"
      }
    ],
    "goals": [
      {
        "id": "issue-13",
        "kind": "issue",
        "source": "github:issue/13",
        "status": "active",
        "summary": "Implement resume and handoff support",
        "successCriteria": [
          "agentrail status prints active run state",
          "agentrail resume writes a handoff"
        ],
        "nonGoals": [
          "Do not change review automation"
        ],
        "activeIssue": 13,
        "activePullRequest": 23,
        "activeMilestone": "docs/milestones/001-agentrail.md",
        "createdAt": "2026-05-26T10:55:00Z",
        "updatedAt": "2026-05-26T11:00:00Z"
      },
      {
        "id": "issue-9",
        "kind": "issue",
        "source": "github:issue/9",
        "status": "blocked",
        "summary": "Blocked verifier retry work",
        "successCriteria": [
          "retry attempts are capped"
        ],
        "nonGoals": [],
        "activeIssue": 9,
        "activePullRequest": null,
        "activeMilestone": null,
        "createdAt": "2026-05-26T10:30:00Z",
        "updatedAt": "2026-05-26T10:50:00Z",
        "blockedAt": "2026-05-26T10:50:00Z",
        "blockedReason": "maximum verifier retry attempts reached after 5 execution attempts"
      }
    ],
    "lastCompletedStep": "runner-adapter-merged",
    "nextSuggestedAction": "Implement resume and handoff support."
  }
}
JSON

"$agentrail" status --target "$target" >"${tmp_dir}/status.out"
assert_grep "AgentRail status:" "${tmp_dir}/status.out" "status did not print header"
assert_grep "install status: state-present" "${tmp_dir}/status.out" "status did not report install state"
assert_grep "phase: implementation" "${tmp_dir}/status.out" "status did not print workflow phase"
assert_grep "active phase: execute" "${tmp_dir}/status.out" "status did not print active phase"
assert_grep "active issue: 13" "${tmp_dir}/status.out" "status did not print active issue"
assert_grep "active pull request: 23" "${tmp_dir}/status.out" "status did not print active PR"
assert_grep "active run: issue #13 via codex (running)" "${tmp_dir}/status.out" "status did not print active run"
assert_grep "active goals:" "${tmp_dir}/status.out" "status did not print active goals heading"
assert_grep "issue-13 active issue #13: Implement resume and handoff support" "${tmp_dir}/status.out" "status did not print concise active goal"
if grep -q -- "retry attempts are capped" "${tmp_dir}/status.out"; then
  echo "status dumped success criteria instead of a concise active goal summary" >&2
  cat "${tmp_dir}/status.out" >&2
  exit 1
fi
assert_grep "active run stale: run dir missing: .agentrail/runs/20260526-110000-issue-13-codex-100" "${tmp_dir}/status.out" "status did not print stale active run"
assert_grep "completed run: issue #8 via codex (completed)" "${tmp_dir}/status.out" "status did not print completed run"
assert_grep "completed run attempts: 2/5; failed verify attempts: 1" "${tmp_dir}/status.out" "status did not print retry attempts"
assert_grep "completed run: issue #9 via codex (failed)" "${tmp_dir}/status.out" "status did not print failed completed run"
assert_grep "completed run blocked reason: maximum verifier retry attempts reached after 5 execution attempts" "${tmp_dir}/status.out" "status did not print failed run blocked reason"
assert_grep "last completed step: runner-adapter-merged" "${tmp_dir}/status.out" "status did not print last completed step"
assert_grep "next action: Implement resume and handoff support." "${tmp_dir}/status.out" "status did not print next action"

handoff_file="${tmp_dir}/handoff.md"
"$agentrail" resume --target "$target" --output "$handoff_file" >"${tmp_dir}/resume.out"
assert_grep "Codex Desktop instruction: do not rely on previous chat context" "${tmp_dir}/resume.out" "resume did not warn against chat-history reliance"
assert_grep "active phase: execute" "${tmp_dir}/resume.out" "resume did not include active phase"
assert_grep "active issue: 13" "${tmp_dir}/resume.out" "resume did not include active issue"
assert_grep "active pull request: 23" "${tmp_dir}/resume.out" "resume did not include active PR"
assert_grep "active run: issue #13 via codex (running)" "${tmp_dir}/resume.out" "resume did not include active run"
assert_grep "active context pack: .agentrail/context/packs/issue-13-execute-20260526T110000000Z.json" "${tmp_dir}/resume.out" "resume did not point to the active context pack"
assert_grep "active goal: issue-13 active issue #13: Implement resume and handoff support" "${tmp_dir}/resume.out" "resume did not include concise active goal"
assert_grep "success criteria: 2" "${tmp_dir}/resume.out" "resume did not include active goal success criteria count"
assert_grep "active run stale: run dir missing: .agentrail/runs/20260526-110000-issue-13-codex-100" "${tmp_dir}/resume.out" "resume did not include stale active run"
assert_grep "completed run: issue #8 via codex (completed)" "${tmp_dir}/resume.out" "resume did not include completed run"
assert_grep "completed run attempts: 2/5; failed verify attempts: 1" "${tmp_dir}/resume.out" "resume did not include retry attempts"
assert_grep "completed run: issue #9 via codex (failed)" "${tmp_dir}/resume.out" "resume did not include failed completed run"
assert_grep "completed run blocked reason: maximum verifier retry attempts reached after 5 execution attempts" "${tmp_dir}/resume.out" "resume did not include failed run blocked reason"
assert_grep "last completed step: runner-adapter-merged" "${tmp_dir}/resume.out" "resume did not include last completed step"
assert_grep "next action: Implement resume and handoff support." "${tmp_dir}/resume.out" "resume did not include next action"
assert_grep "Verification commands:" "${tmp_dir}/resume.out" "resume did not include verification commands"
assert_grep "docs/agents/agentrail-state.md" "${tmp_dir}/resume.out" "resume did not include relevant docs"
assert_grep "handoff: ${handoff_file}" "${tmp_dir}/resume.out" "resume did not print handoff path"
assert_grep "Codex Desktop instruction: do not rely on previous chat context" "$handoff_file" "resume did not write handoff file"

"$agentrail" resume --target "$target" >"${tmp_dir}/default-resume.out"
default_handoff="$(find "${target}/.agentrail/handoffs" -name '*-resume.md' -print | head -1)"
[[ -n "$default_handoff" ]] || { echo "resume did not write default handoff under .agentrail/handoffs" >&2; exit 1; }
assert_grep "active issue: 13" "$default_handoff" "default handoff did not include active issue"

missing="${tmp_dir}/missing"
mkdir -p "$missing"
"$agentrail" status --target "$missing" >"${tmp_dir}/missing-status.out"
assert_grep "install status: missing-state" "${tmp_dir}/missing-status.out" "status did not handle missing state"
assert_grep "agentrail init --target ${missing}" "${tmp_dir}/missing-status.out" "missing status did not recommend init"

"$agentrail" resume --target "$missing" --output "${tmp_dir}/missing-handoff.md" >"${tmp_dir}/missing-resume.out"
assert_grep "AgentRail state was not found" "${tmp_dir}/missing-resume.out" "resume did not explain missing state"
assert_grep "do not rely on previous chat context" "${tmp_dir}/missing-resume.out" "missing-state resume did not include Codex Desktop instruction"
assert_grep "agentrail install --target ${missing}" "${tmp_dir}/missing-resume.out" "missing-state resume did not recommend adoption/install"

echo "resume handoff test passed"
