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

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

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

mkdir -p "$tmpdir/presets" "$tmpdir/spec" "$tmpdir/wrappers" "$tmpdir/docs/specs" "$tmpdir/docs/plans" "$tmpdir/lib" "$tmpdir/src"
cp "$ROOT/presets/_validate.mjs" "$tmpdir/presets/_validate.mjs"
cp "$ROOT/spec/presets.schema.json" "$tmpdir/spec/presets.schema.json"
cp "$ROOT/spec/runconfig.schema.json" "$tmpdir/spec/runconfig.schema.json"
cp "$ROOT/spec/events.schema.json" "$tmpdir/spec/events.schema.json"

cat >"$tmpdir/wrappers/codex.sh" <<'EOF'
#!/usr/bin/env bash
exit 0
EOF
chmod +x "$tmpdir/wrappers/codex.sh"

cat >"$tmpdir/wrappers/ca.sh" <<'EOF'
#!/usr/bin/env bash
exit 0
EOF
chmod +x "$tmpdir/wrappers/ca.sh"

cat >"$tmpdir/wrappers/na.sh" <<'EOF'
#!/usr/bin/env bash
exit 0
EOF
chmod +x "$tmpdir/wrappers/na.sh"

cat >"$tmpdir/presets/adapters.json" <<'EOF'
{
  "version": "adapters/v1",
  "adapters": [
    {
      "id": "codex",
      "wrapper": "wrappers/codex.sh",
      "models": ["gpt-5.5-high", "gpt-5.5-medium", "gpt-5.5-low"]
    },
    {
      "id": "cursor",
      "wrapper": "wrappers/ca.sh",
      "models": ["composer-2.5"]
    },
    {
      "id": "north",
      "wrapper": "wrappers/na.sh",
      "models": ["cohere/north-mini-code:free"]
    }
  ]
}
EOF

cat >"$tmpdir/presets/good.json" <<'EOF'
{
  "name": "good",
  "version": "preset/v1",
  "seats": {
    "coder": {
      "low": {
        "wrapper": "wrappers/na.sh",
        "model": "cohere/north-mini-code:free"
      },
      "medium": {
        "wrapper": "wrappers/ca.sh",
        "model": "composer-2.5"
      },
      "high": {
        "wrapper": "wrappers/codex.sh",
        "model": "gpt-5.5-high",
        "fallback": "coder.medium"
      }
    },
    "reviewer": {
      "wrapper": "wrappers/codex.sh",
      "model": "gpt-5.5-low"
    }
  }
}
EOF

cat >"$tmpdir/presets/anthropic-less.json" <<'EOF'
{
  "name": "anthropic-less",
  "version": "preset/v1",
  "seats": {
    "coder": {
      "low": {
        "wrapper": "wrappers/na.sh",
        "model": "cohere/north-mini-code:free"
      },
      "medium": {
        "wrapper": "wrappers/ca.sh",
        "model": "composer-2.5"
      },
      "high": {
        "wrapper": "wrappers/codex.sh",
        "model": "gpt-5.5-high",
        "fallback": "coder.medium"
      }
    },
    "reviewer": {
      "wrapper": "wrappers/codex.sh",
      "model": "gpt-5.5-low"
    }
  }
}
EOF

cat >"$tmpdir/presets/codex.json" <<'EOF'
{
  "name": "codex",
  "version": "preset/v1",
  "seats": {
    "coder": {
      "low": {
        "wrapper": "wrappers/codex.sh",
        "model": "gpt-5.5-low"
      },
      "medium": {
        "wrapper": "wrappers/codex.sh",
        "model": "gpt-5.5-medium"
      },
      "high": {
        "wrapper": "wrappers/codex.sh",
        "model": "gpt-5.5-high"
      }
    }
  }
}
EOF

cat >"$tmpdir/spec/PRESETS.md" <<'EOF'
For a node with `seat` S and `tier` T (default T = `medium`):
Example coder ladder: `low -> north`, `medium -> composer-2.5`, `high -> gpt-5.5-high`.
EOF

cat >"$tmpdir/spec/runconfig.schema.json" <<'EOF'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "additionalProperties": false,
  "required": ["version", "preset"],
  "properties": {
    "version": { "const": "runconfig/v1" },
    "preset": { "type": "string" },
    "overrides": {
      "type": "object",
      "propertyNames": { "pattern": "^[a-z0-9][a-z0-9-]*(\\.[a-z0-9][a-z0-9-]*)?$" },
      "additionalProperties": { "$ref": "presets.schema.json#/$defs/binding" }
    }
  }
}
EOF

cat >"$tmpdir/docs/specs/2026-06-27-mega-plan-harness-design.md" <<'EOF'
Plan node vocabulary = `seat` + `tier`.
Each `task` record carries `tier` (`low|medium|high`).
EOF

cat >"$tmpdir/docs/plans/2026-06-27-mega-plan-harness.md" <<'EOF'
| 1 | resolve-seat.sh + tests | coder.medium | lib/resolve-seat.sh | -- |
EOF

cat >"$tmpdir/docs/plans/2026-06-27-mega-plan-harness.jsonl" <<'EOF'
{"type":"task","id":"w1.p2.t1","seat":"coder","tier":"medium","status":"COMMITTED"}
EOF

cat >"$tmpdir/lib/resolve-seat.sh" <<'EOF'
#!/usr/bin/env bash
echo '.tier // "medium"'
EOF

cat >"$tmpdir/src/dynwf-driver.js" <<'EOF'
const example = { seat: 'coder', tier: 'medium' };
console.log(example);
EOF

good_output="$(cd "$tmpdir" && node presets/_validate.mjs 2>&1)"
case "$good_output" in
  *"validated 3 preset(s) and 3 example runconfig(s)"*) ;;
  *)
    echo "expected successful validation output, got:" >&2
    echo "$good_output" >&2
    exit 1
    ;;
esac

cat >"$tmpdir/spec/PRESETS.md" <<'EOF'
For a node with `seat` S and `tier` T (default T = `regular`):
Example coder ladder: `simple -> north`, `regular -> composer-2.5`, `critical -> gpt-5.5-high`.
EOF

if (cd "$tmpdir" && node presets/_validate.mjs >"$tmpdir/tier-rename-gate.out" 2>"$tmpdir/tier-rename-gate.err"); then
  echo "expected validator to reject legacy tier vocabulary" >&2
  exit 1
fi

grep -q 'retired tier vocabulary' "$tmpdir/tier-rename-gate.err"
grep -q 'spec/PRESETS.md' "$tmpdir/tier-rename-gate.err"

echo "tier-rename-gate: ok"
