#!/usr/bin/env node
import { readFileSync } from 'node:fs'

const DEFAULT_ORIGIN = 'https://getzero.dev'

function argValue(name, fallback = null) {
  const index = process.argv.indexOf(name)
  if (index === -1) return fallback
  return process.argv[index + 1] || fallback
}

function assert(condition, message) {
  if (!condition) throw new Error(message)
}

async function fetchJson(origin, path) {
  const response = await fetch(`${origin}${path}`, {
    headers: { accept: 'application/json' },
  })
  const text = await response.text()
  assert(response.ok, `${path} returned HTTP ${response.status}: ${text.slice(0, 160)}`)
  return JSON.parse(text)
}

function fixtureMode(file) {
  const fixture = JSON.parse(readFileSync(file, 'utf8'))
  const replay = fixture?.endpoints?.foundation_genesis_replay?.response
  assert(fixture.schema_version === 'zero.decision_replay_examples.v1', 'unexpected replay example fixture')
  assert(replay?.schema_version === 'zero.decision_replay.v1', 'fixture replay schema version mismatch')
  assert(replay?.links?.schema === 'https://getzero.dev/contracts/zero.decision_replay.v1.schema.json', 'fixture replay schema link mismatch')
  return {
    mode: 'fixture',
    replay_id: replay.replay_id,
    schema_version: replay.schema_version,
    audit_status: replay.audit.status,
  }
}

async function liveMode(origin) {
  const developerContract = await fetchJson(origin, '/api/developers/proof')
  assert(developerContract.schema_version === 'zero.developer_proof_api.v1', 'developer proof contract mismatch')
  assert(developerContract.safety.can_execute_orders === false, 'developer proof contract must be read-only')

  const index = await fetchJson(origin, '/api/replays?limit=1')
  const replayId = index?.replays?.[0]?.replay_id || 'foundation-genesis'
  const replay = await fetchJson(origin, `/api/replays/${encodeURIComponent(replayId)}`)
  assert(replay.schema_version === 'zero.decision_replay.v1', 'replay schema version mismatch')

  const [receiptCard, graphContext, exportCapsule] = await Promise.all([
    fetchJson(origin, `/api/replays/${encodeURIComponent(replayId)}/receipt-card`),
    fetchJson(origin, `/api/replays/${encodeURIComponent(replayId)}/graph-context`),
    fetchJson(origin, '/api/replays/export?limit=1'),
  ])

  return {
    mode: 'live',
    origin,
    replay_id: replayId,
    replay_schema: replay.schema_version,
    receipt_schema: receiptCard.schema_version,
    graph_schema: graphContext.schema_version,
    export_schema: exportCapsule.schema_version,
  }
}

const fixture = argValue('--fixture')
const origin = (argValue('--origin', process.env.ZERO_PROOF_API_ORIGIN || DEFAULT_ORIGIN) || DEFAULT_ORIGIN).replace(/\/+$/, '')
const result = fixture ? fixtureMode(fixture) : await liveMode(origin)
console.log(JSON.stringify(result, null, 2))
