<?php
declare(strict_types=1);

// In-memory fault cases only: no DB, HTTP, filesystem mutation or process action.
require __DIR__ . '/recover_swapped_a_policy.php';
$marker = 'CDXEMDUAL89C5BDEB043A';
$journal = ['lane' => 'A', 'phase' => 'http_started', 'marker' => $marker,
    'actor_id' => 123, 'menu_id' => 456, 'uuid' => str_repeat('A', 32),
    'public_token' => str_repeat('b', 64), 'source_before' => [
        'electronic_menu' => str_repeat('1', 64),
        'electronic_menu_bind_code' => str_repeat('2', 64),
        'electronic_menu_device' => str_repeat('3', 64),
        'electronic_menu_device_log' => str_repeat('4', 64)]];
$seen = ['same_worker_generation' => true, 'same_source' => true,
    'two_ordered_boundaries' => true, 'dev_db_identity' => true,
    'actor_rows' => [['id' => 123, 'uuid' => $marker,
        'account' => $marker, 'type' => 0, 'create_by' => $marker,
        'is_delete' => 0]],
    'menu_rows' => [['id' => 456, 'uuid' => $journal['uuid'],
        'public_token' => $journal['public_token'], 'create_by' => $marker,
        'store_id' => 10001, 'display_mode' => 2,
        'status' => 1, 'is_delete' => 0,
        'left_restaurant_id' => 11, 'right_restaurant_id' => 22,
        'carousel_interval' => 9]],
    'relations' => ['electronic_menu_bind_code' => 0,
        'electronic_menu_device' => 0,
        'electronic_menu_device_log' => 0],
    'unmodified_relation_hashes' => true];
$cases = [];
$cases['exact_one_each'] = dualSwappedARecoveryDecision($journal, $seen) === 'exact_delete';
$zero = $seen;
$zero['actor_rows'] = [];
$zero['menu_rows'] = [];
$zero['full_baseline_restored'] = true;
$cases['commit_done_journal_failed'] =
    dualSwappedARecoveryDecision($journal, $zero) === 'advance_zero';
$zero['full_baseline_restored'] = false;
$cases['missing_rows_baseline_drift_denied'] =
    dualSwappedARecoveryDecision($journal, $zero) === 'deny';
$bad = $seen;
$bad['two_ordered_boundaries'] = false;
$cases['unknown_http_denied'] = dualSwappedARecoveryDecision($journal, $bad) === 'deny';
$bad = $seen;
$bad['same_worker_generation'] = false;
$cases['pid_reuse_denied'] = dualSwappedARecoveryDecision($journal, $bad) === 'deny';
$bad = $seen;
$bad['menu_rows'][0]['public_token'] = str_repeat('c', 64);
$cases['menu_identity_drift_denied'] = dualSwappedARecoveryDecision($journal, $bad) === 'deny';
$bad = $seen;
$bad['actor_rows'][] = $bad['actor_rows'][0];
$cases['duplicate_actor_denied'] = dualSwappedARecoveryDecision($journal, $bad) === 'deny';
$bad = $seen;
$bad['relations']['electronic_menu_device'] = 1;
$cases['device_relation_denied'] = dualSwappedARecoveryDecision($journal, $bad) === 'deny';
$bad = $seen;
$bad['unmodified_relation_hashes'] = false;
$cases['other_relation_change_denied'] = dualSwappedARecoveryDecision($journal, $bad) === 'deny';
$bad = $journal;
$bad['phase'] = 'cleanup_committed';
$cases['phase_drift_denied'] = dualSwappedARecoveryDecision($bad, $seen) === 'deny';
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,
    'business_http_sent' => false, 'dml_sent' => false]), PHP_EOL;
