<?php
declare(strict_types=1);

// Pure fault injection: no files, processes, HTTP, database or DML.
require __DIR__ . '/race_write_recovery_policy.php';
$marker = 'CDXEMRACEABCDEF123456';
$menu = ['id' => 31, 'uuid' => str_repeat('A', 32),
    'public_token' => str_repeat('b', 64), 'create_by' => $marker,
    'store_id' => 10001];
$code = ['id' => 41, 'menu_id' => 31, 'code_hash' => str_repeat('c', 64),
    'create_by' => $marker, 'store_id' => 10001];
$journal = ['lane' => 'C', 'marker' => $marker, 'phase' => 'fixture_intent',
    'menu_uuid' => $menu['uuid'], 'public_token' => $menu['public_token'],
    'code_hash' => $code['code_hash'], 'menu_id' => 0, 'code_id' => 0,
    'device_ids' => [1 => $marker . 'A', 2 => $marker . 'B']];
$empty = ['menus' => [], 'codes' => [], 'device_count' => 0,
    'log_count' => 0, 'router_pristine' => true,
    'workers_quiescent' => true, 'baseline_equal' => true];
$cases = [];
$result = raceWriteRecoveryDecision($journal, $empty);
$cases['before_menu_insert_zero'] = ($result['action'] ?? '') === 'advance_clean_zero';
$observed = $empty;
$observed['menus'] = [$menu];
$result = raceWriteRecoveryDecision($journal, $observed);
$cases['menu_insert_before_journal'] = ($result['action'] ?? '') === 'cleanup_pre_http';
$observed['codes'] = [$code];
$result = raceWriteRecoveryDecision($journal, $observed);
$cases['code_insert_before_journal'] = ($result['action'] ?? '') === 'cleanup_pre_http';
$journal['phase'] = 'bind_code_inserted';
$journal['menu_id'] = 31;
$journal['code_id'] = 41;
$result = raceWriteRecoveryDecision($journal, $observed);
$cases['recorded_ids_match'] = ($result['action'] ?? '') === 'cleanup_pre_http';
$wrongId = $journal;
$wrongId['code_id'] = 42;
$result = raceWriteRecoveryDecision($wrongId, $observed);
$cases['recorded_id_drift_denied'] = ($result['allowed'] ?? true) === false;
$journal['phase'] = 'two_http_started';
$result = raceWriteRecoveryDecision($journal, $observed);
$cases['one_post_or_timeout_unknown_denied'] = ($result['allowed'] ?? true) === false;
$journal['phase'] = 'both_worker_barriers_confirmed';
$result = raceWriteRecoveryDecision($journal, $empty);
$cases['commit_done_journal_failed_zero'] = ($result['action'] ?? '') === 'advance_clean_zero';
$notQuiescent = $empty;
$notQuiescent['workers_quiescent'] = false;
$result = raceWriteRecoveryDecision($journal, $notQuiescent);
$cases['commit_zero_worker_unknown_denied'] = ($result['allowed'] ?? true) === false;
$result = raceWriteRecoveryDecision($journal, $observed);
$cases['post_http_rows_remain_denied'] = ($result['allowed'] ?? true) === false;
$journal['phase'] = 'fixture_intent';
$journal['menu_id'] = 0;
$journal['code_id'] = 0;
$bad = $observed;
$bad['menus'] = [];
$result = raceWriteRecoveryDecision($journal, $bad);
$cases['orphan_code_denied'] = ($result['allowed'] ?? true) === false;
$bad = $observed;
$bad['menus'][0]['public_token'] = str_repeat('d', 64);
$result = raceWriteRecoveryDecision($journal, $bad);
$cases['other_menu_identity_denied'] = ($result['allowed'] ?? true) === false;
$bad = $observed;
$bad['device_count'] = 1;
$result = raceWriteRecoveryDecision($journal, $bad);
$cases['unexpected_device_denied'] = ($result['allowed'] ?? true) === false;
$bad = $observed;
$bad['router_pristine'] = false;
$result = raceWriteRecoveryDecision($journal, $bad);
$cases['router_arrival_before_phase_denied'] = ($result['allowed'] ?? true) === false;
$bad = $empty;
$bad['baseline_equal'] = false;
$result = raceWriteRecoveryDecision($journal, $bad);
$cases['zero_but_other_rows_changed_denied'] = ($result['allowed'] ?? true) === false;
if (in_array(false, $cases, true)) {
    echo json_encode(['status' => 'offline_policy_fail', 'cases' => $cases]), PHP_EOL;
    exit(1);
}
echo json_encode(['status' => 'offline_policy_pass', 'cases' => $cases,
    'io' => false, 'http' => false, 'dml' => false]), PHP_EOL;
