<?php
declare(strict_types=1);
require __DIR__.'/NativeContract.php';
$plan = json_decode(file_get_contents(__DIR__.'/plan.json'), true);
$assertions = 0;
$reject = static function(callable $run) use (&$assertions): void {
    try { $run(); } catch (RuntimeException $e) { $assertions++; return; }
    throw new RuntimeException('Expected contract rejection');
};
$reject(static function() use ($plan) { PlainScalarNativeContract::assertMarker($plan); });
$approved = $plan; $approved['approval_status'] = 'ROOT_APPROVED_FOR_EXACT_NEW_EXECUTION';
PlainScalarNativeContract::assertMarker($approved); $assertions++;
foreach (['missing',null,'','other'] as $marker) {
    $mutant = $approved;
    if ($marker === 'missing') unset($mutant['marker']); else $mutant['marker'] = $marker;
    $reject(static function() use ($mutant) { PlainScalarNativeContract::assertMarker($mutant); });
}
foreach (['B','C'] as $lane) {
    $captured = json_decode(file_get_contents(__DIR__.'/../parallel-store-nutrition-plain-float-weight-20261011/candidate-phase/private/final/'.$lane.'/wire-candidate-weight-12346-update.json'), true);
    $events = array_values(array_filter($captured['native'], static function($event) { return ($event['layer'] ?? '') === 'PDOStatement.execute' && strpos($event['sql'] ?? '', 'UPDATE ') === 0; }));
    if (count($events) !== 1) throw new RuntimeException('Exact captured reference');
    foreach ($plan['cases'] as $case) {
        if ($case['target_DML_attempt_max'] === 0) {
            $reject(static function() use ($lane,$case) { PlainScalarNativeContract::expectedSql($lane,$case); });
            continue;
        }
        $params = $captured['case']['params']; $params['use_weight'] = $case['value'];
        $binds = [];
        foreach (PlainScalarNativeContract::FIELDS as $field) {
            if ($lane === 'C' && $field === 'use_weight' && $case['C_weight_shape'] === 'generated-REAL') continue;
            if ($field === 'use_weight') $binds[':data__'.$field] = ['value'=>$case['value'],'type'=>1,'php_type'=>'string','ok'=>true];
            else $binds[':data__'.$field] = $events[0]['binds'][':data__'.$field];
        }
        $binds[':where_AND_uuid'] = $events[0]['binds'][':where_AND_uuid'];
        $uuid = $plan['target'][$lane]['uuid'];
        $sql = PlainScalarNativeContract::expectedSql($lane,$case);
        $reference = preg_replace('/`use_weight`=(?:CAST\([^)]*\)|:data__use_weight)/',
            '`use_weight`='.($lane === 'C' && $case['C_weight_shape'] === 'generated-REAL' ? $case['C_generated_expression'] : ':data__use_weight'), $events[0]['sql']);
        if ($reference !== $sql) throw new RuntimeException('Original exact SQL byte comparison');
        PlainScalarNativeContract::assertUpdate($sql,$binds,null,$lane,$case,$params,$uuid); $assertions++;
        foreach (['sql','bind-value','bind-type','bind-php-type','extra-bind','uuid','extra-MD','execute-params','case-label','case-value'] as $mutation) {
            $s=$sql; $b=$binds; $c=$case; $p=$params; $u=$uuid; $exec=null;
            switch ($mutation) {
                case 'sql': $s .= ' '; break;
                case 'bind-value': $b[':data__name']['value'].='changed'; break;
                case 'bind-type': $b[':data__name']['type']=1; break;
                case 'bind-php-type': $b[':data__use_number']['php_type']='double'; break;
                case 'extra-bind': $b[':data__power']=['value'=>1.0,'type'=>1,'php_type'=>'double','ok'=>true]; break;
                case 'uuid': $u='wrong'; break;
                case 'extra-MD': $p['power']=1.0; break;
                case 'execute-params': $exec=[]; break;
                case 'case-label': $c['label']='unapproved'; break;
                case 'case-value': $c['value']='12.346'; $p['use_weight']='12.346'; break;
            }
            $reject(static function() use($s,$b,$exec,$lane,$c,$p,$u) { PlainScalarNativeContract::assertUpdate($s,$b,$exec,$lane,$c,$p,$u); });
        }
    }
}
echo json_encode(['pure_contract_assertions'=>$assertions,'SQL'=>0,'PDO_initialization'=>0,'HTTP'=>0,'DML'=>0,'approval'=>'source-only unchanged']),PHP_EOL;
