<?php
declare(strict_types=1);
require __DIR__.'/gate.php';
$checks=0;$mutations=[];
$pass=static function($ok,$msg)use(&$checks){$checks++;nf_check($ok,$msg);};
$reject=static function(callable $fn,string $label)use(&$checks,&$mutations){$checks++;try{$fn();}catch(Throwable $e){$mutations[]=$label;return;}throw new RuntimeException('Mutation survived: '.$label);};
$p=nf_plan(__DIR__.'/probe-plan.json');foreach(['B','C']as $lane)nf_shape($p['lanes'][$lane]['five_float_group'],$lane);
$names=['ID','MARKER','POWER','CARBOHYDRATE','PROTEIN','FAT','SODIUM'];
$bcols=[];$ccols=[];
foreach($names as $i=>$n){
 $bcols[]=['column_name'=>strtolower($n),'column_type'=>$i===0?'int(11)':($i===1?'varchar(16)':'float(8,2)'),'is_nullable'=>$i<2?'NO':'YES','column_default'=>null,'extra'=>''];
 $ccols[]=['column_name'=>$n,'data_type'=>$i===0?'INTEGER':($i===1?'VARCHAR':'FLOAT'),'data_length'=>$i===0?4.0:($i===1?64.0:8.0),'data_precision'=>$i<2?null:53.0,'data_scale'=>$i<2?null:0.0,'nullable'=>$i<2?'N':'Y','data_default'=>$i<2?null:'NULL'];
}
$b=[$bcols,[['index_name'=>'PRIMARY','non_unique'=>0,'column_name'=>'id']],[['constraint_type'=>'PRIMARY KEY']],[['column_name'=>'id','referenced_table_name'=>null]],[],[['create table'=>'CREATE TABLE "cdx_nf5_261011_d9a4" ("MARKER" VARCHAR(16))']]];
$c=[$ccols,[['index_name'=>'INDEX33556689','uniqueness'=>'NONUNIQUE','index_type'=>'CLUSTER'],['index_name'=>'INDEX33556690','uniqueness'=>'UNIQUE','index_type'=>'NORMAL']],[['index_name'=>'INDEX33556690','column_name'=>'ID','column_position'=>1.0]],[['constraint_name'=>'CONS134219110','constraint_type'=>'P','status'=>'ENABLED']],[['constraint_name'=>'CONS134219110','column_name'=>'ID','position'=>1.0]],[],[['ddl'=>'CREATE TABLE "ZHCT_APP"."CDX_NF5_261011_D9A4" ("MARKER" VARCHAR(16 CHAR))']]];
nf_fingerprint_gate($b,'B');nf_fingerprint_gate($c,'C');$checks+=2;
foreach([
 ['wrong ordinary table',static function()use($p){$x=$p['lanes']['B']['five_float_group'];$x['table_name']='YDY_NUTRITION';nf_shape($x,'B');}],
 ['case omitted',static function()use($p){$x=$p['lanes']['B']['five_float_group'];array_pop($x['steps']);nf_shape($x,'B');}],
 ['DML budget weakened',static function()use($p){$x=$p['lanes']['C']['five_float_group'];$x['budget']['total_DML_attempts']=73;nf_shape($x,'C');}],
 ['placeholder removed',static function()use($p){$x=$p['lanes']['B']['five_float_group'];array_pop($x['steps'][0]['DML'][0]['bindings']);nf_shape($x,'B');}],
 ['natural DML target',static function()use($p){$x=$p['lanes']['C']['five_float_group'];$x['steps'][0]['DML'][0]['sql']=str_replace('CDX_NF5_261011_D9A4','YDY_NUTRITION',$x['steps'][0]['DML'][0]['sql']);nf_shape($x,'C');}],
 ['GTT forbidden',static function()use($p){$x=$p['lanes']['C']['five_float_group'];$x['fingerprint_gate']['expected_ordinary']=false;nf_shape($x,'C');}],
 ['unexpected NOTNULL constraint representation',static function()use($c){$x=$c;$x[3][]=['constraint_type'=>'C','status'=>'ENABLED'];nf_fingerprint_gate($x,'C');}],
 ['unexpected trigger',static function()use($b){$x=$b;$x[4][]=['trigger_name'=>'X'];nf_fingerprint_gate($x,'B');}],
 ['unexpected FK',static function()use($b){$x=$b;$x[3][]=['column_name'=>'power','referenced_table_name'=>'ydy_nutrition'];nf_fingerprint_gate($x,'B');}],
 ['FLOAT32 mistaken for FLOAT53',static function()use($c){$x=$c;$x[0][2]['data_precision']=24.0;nf_fingerprint_gate($x,'C');}],
 ['FLOAT decimals changed',static function()use($b){$x=$b;$x[0][2]['column_type']='float';nf_fingerprint_gate($x,'B');}],
 ['column nullability changed',static function()use($c){$x=$c;$x[0][3]['nullable']='N';nf_fingerprint_gate($x,'C');}],
 ['marker capacity widened',static function()use($c){$x=$c;$x[6][0]['ddl']=str_replace('VARCHAR(16','VARCHAR(32',$x[6][0]['ddl']);nf_fingerprint_gate($x,'C');}],
 ['physical definition changed to GTT',static function()use($c){$x=$c;$x[6][0]['ddl']=str_replace('CREATE TABLE','CREATE GLOBAL TEMPORARY TABLE',$x[6][0]['ddl']);nf_fingerprint_gate($x,'C');}],
 ['wrong rollback rowcount',static function(){nf_num(1.0,0,'Zero row gate');}],
 ['unknown noninteger rowcount',static function(){nf_num('x',0,'Zero row gate');}],
 ['own FLOAT default zero',static function()use($c){$x=$c;$x[0][2]['data_default']='0';nf_fingerprint_gate($x,'C');}],
 ['own FLOAT quoted SQL string literal NULL',static function()use($c){$x=$c;$x[0][2]['data_default']="'NULL'";nf_fingerprint_gate($x,'C');}],
 ['own FLOAT lowercase or spaced NULL',static function()use($c){$x=$c;$x[0][2]['data_default']=' null ';nf_fingerprint_gate($x,'C');}],
 ['other ID column default NULL string',static function()use($c){$x=$c;$x[0][0]['data_default']='NULL';nf_fingerprint_gate($x,'C');}],
 ['other MARKER column default NULL string',static function()use($c){$x=$c;$x[0][1]['data_default']='NULL';nf_fingerprint_gate($x,'C');}],
 ['missing own FLOAT column',static function()use($c){$x=$c;array_pop($x[0]);nf_fingerprint_gate($x,'C');}],
]as $item)$reject($item[1],$item[0]);
$domain=new PDOException('source range',0);$domain->errorInfo=['22003',1264,'range'];$pass(nf_domain($domain,'B'),'Known B range observation');
$sqlError=new PDOException('SQL syntax',0);$sqlError->errorInfo=['HY000',-2007,'syntax'];$pass(!nf_domain($sqlError,'C'),'SQL tooling cannot become domain error');
$bytes=file_get_contents(__DIR__.'/probe-plan.json');$pass(hash('sha256',$bytes)===NF_PLAN_SHA,'Exact frozen bytes');
$pass(hash('sha256',str_replace('"12.345"','"12.35"',$bytes))!==NF_PLAN_SHA,'Rounded-input mutation fails SHA');
echo json_encode(['status'=>'PURE_GATE_PASS','assertions'=>$checks,'negative_gates_rejected'=>$mutations,'DB_connections'=>0,'DDL'=>0,'DML'=>0,'HTTP'=>0],JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE),"\n";
