@page "/api"

<PageTitle>API Surface</PageTitle>

<div class="api-grid">
    <section class="panel">
        <h2 class="panel-title">Reference data</h2>
        <p class="panel-copy"><code>GET /api/reference-data</code></p>
        <pre class="code-block">{
  "attackTables": [
    {
      "key": "broadsword",
      "label": "Broadsword",
      "attackKind": "melee",
      "fumbleMinRoll": 1,
      "fumbleMaxRoll": 2
    }
  ],
  "criticalTables": [
    {
      "key": "mana",
      "label": "Mana Critical Strike Table",
      "family": "standard",
      "sourceDocument": "Mana.pdf",
      "notes": "Imported from PDF XML extraction."
    }
  ]
}</pre>
    </section>

    <section class="panel">
        <h2 class="panel-title">Attack lookup</h2>
        <p class="panel-copy"><code>POST /api/lookup/attack</code></p>
        <pre class="code-block">{
  "attackTable": "broadsword",
  "armorType": "AT10",
  "roll": 111,
  "criticalRoll": 72
}</pre>
    </section>

    <section class="panel">
        <h2 class="panel-title">Critical lookup</h2>
        <p class="panel-copy"><code>POST /api/lookup/critical</code></p>
        <pre class="code-block">{
  "criticalType": "mana",
  "column": "E",
  "roll": 100,
  "group": null
}</pre>
        <p class="panel-copy">Response now includes table metadata, roll-band bounds, raw imported cell text, parse status, and parsed JSON alongside the gameplay description.</p>
    </section>

    <section class="panel">
        <h2 class="panel-title">Cell editor load</h2>
        <p class="panel-copy"><code>GET /api/tables/critical/{slug}/cells/{resultId}</code></p>
        <pre class="code-block">{
  "resultId": 412,
  "tableSlug": "slash",
  "tableName": "Slash Critical Strike Table",
  "rollBand": "66-70",
  "groupKey": null,
  "columnKey": "C",
  "isCurated": false,
  "sourcePageNumber": 1,
  "sourceImageUrl": "/api/tables/critical/slash/cells/412/source-image",
  "rawCellText": "Original imported full cell text",
  "descriptionText": "Current curated prose",
  "rawAffixText": "+8H - 2S",
  "parseStatus": "verified",
  "parsedJson": "{\"version\":1,\"isDescriptionOverridden\":false,\"isRawAffixTextOverridden\":false,\"areEffectsOverridden\":false,\"areBranchesOverridden\":false,\"effects\":[],\"branches\":[]}",
  "isDescriptionOverridden": false,
  "isRawAffixTextOverridden": false,
  "areEffectsOverridden": false,
  "areBranchesOverridden": false,
  "validationMessages": [],
  "effects": [],
  "branches": []
}</pre>
        <p class="panel-copy">Use this to retrieve the full editable result graph for one critical-table cell, including nested branches, normalized effects, and review notes for unresolved quick-parse tokens.</p>
    </section>

    <section class="panel">
        <h2 class="panel-title">Cell source image</h2>
        <p class="panel-copy"><code>GET /api/tables/critical/{slug}/cells/{resultId}/source-image</code></p>
        <p class="panel-copy">Streams the importer-generated PNG crop for the current critical cell. Returns <code>404</code> when the row has no stored crop or the artifact is missing.</p>
    </section>

    <section class="panel">
        <h2 class="panel-title">Cell re-parse</h2>
        <p class="panel-copy"><code>POST /api/tables/critical/{slug}/cells/{resultId}/reparse</code></p>
        <pre class="code-block">{
  "currentState": {
    "rawCellText": "Strike to thigh. +8H\nWith greaves: blow glances aside.",
    "descriptionText": "Curated prose",
    "rawAffixText": "+8H",
    "parseStatus": "partial",
    "parsedJson": "{}",
    "isCurated": false,
    "isDescriptionOverridden": true,
    "isRawAffixTextOverridden": false,
    "areEffectsOverridden": false,
    "areBranchesOverridden": false,
    "effects": [],
    "branches": []
  }
}</pre>
        <p class="panel-copy">Re-runs the shared single-cell parser, merges the generated result with the current override state, and returns the refreshed editor payload without saving changes. Unknown or partially parsed tokens are surfaced explicitly in the returned review data.</p>
    </section>

    <section class="panel">
        <h2 class="panel-title">Cell editor save</h2>
        <p class="panel-copy"><code>PUT /api/tables/critical/{slug}/cells/{resultId}</code></p>
        <pre class="code-block">{
  "rawCellText": "Corrected imported text",
    "descriptionText": "Rewritten prose after manual review",
  "rawAffixText": "+10H - must parry 2 rnds",
  "parseStatus": "manually_curated",
  "parsedJson": "{\"reviewed\":true}",
  "isCurated": true,
  "isDescriptionOverridden": true,
  "isRawAffixTextOverridden": false,
  "areEffectsOverridden": false,
  "areBranchesOverridden": false,
  "effects": [
    {
      "effectCode": "direct_hits",
      "target": null,
      "valueInteger": 10,
      "valueDecimal": null,
      "valueExpression": null,
      "durationRounds": null,
      "perRound": null,
      "modifier": null,
      "bodyPart": null,
      "isPermanent": false,
      "sourceType": "symbol",
      "sourceText": "+10H",
      "originKey": "base:direct_hits:1",
      "isOverridden": true
    }
  ],
  "branches": []
}</pre>
        <p class="panel-copy">The save endpoint replaces the stored base result, branch rows, and effect rows for that cell with the submitted curated payload.</p>
    </section>
</div>
