<?php
declare(strict_types=1);
const NH_SHA='169ada31e30e80ab5dea1059f8de512c47cff634df14ed5194f999a0cf7b78c3';
function nh_check($ok,string $message):void {if(!$ok)throw new RuntimeException($message);}
function nh_num($value,int $expected,string $message):void {nh_check((is_int($value)||is_float($value)||(is_string($value)&&is_numeric($value)))&&(float)$value===(float)$expected,$message);}
function nh_load(string $file):array {nh_check(hash_file('sha256',$file)===NH_SHA,'Approved new plan bytes');return json_decode(file_get_contents($file),true,512,JSON_THROW_ON_ERROR);}
function nh_shape(array $p,string $lane):void{
 nh_check(in_array($lane,['B','C'],true),'Known lane');$s=$p['lanes'][$lane];
 nh_check($p['actual_execution']===['DB_connections'=>0,'SQL'=>0,'DDL'=>0,'DML'=>0,'business_HTTP'=>0],'No false proposal execution');
 nh_check($s['table']===($lane==='B'?'cdx_nfh_261011_e2f7':'CDX_NFH_261011_E2F7')&&$s['marker']==='CDXNFHE2F7','Exact new table marker');
 nh_check(count($s['point_cases'])===48&&count($s['aggregate_cases'])===4&&$s['max_live_rows']===2,'Exact case/row counts');
 $pos=0;
 foreach($p['modes']as $mode)foreach($p['inputs']as $i=>$input){
  $case=$s['point_cases'][$pos++];$d=$case['DML'];
  nh_check($case['case_id']===$mode['id'].'-H'.str_pad((string)($i+1),2,'0',STR_PAD_LEFT),'Original ordered case');
  nh_check(array_column($d['bindings'],'original_value')===[1,$s['marker'],$input['value'],$input['value']],'Original point input bytes, no rounding');
  nh_check(array_column($d['bindings'],'PDO_type_code')===[1,2,$mode['PDO_code'],$mode['PDO_code']],'Original point binding codes');
 }
 $pairs=[['12.345','12.344'],['999999.94','-999999.93']];$pos=0;
 foreach($p['modes']as $mode)foreach($pairs as $i=>$pair){
  $case=$s['aggregate_cases'][$pos++];nh_check($case['case_id']===$mode['id'].'-A'.($i+1)&&count($case['DML'])===2,'Exact aggregate cases/pairs');
  foreach($pair as $j=>$input){$d=$case['DML'][$j];nh_check(array_column($d['bindings'],'original_value')===[$j+1,$s['marker'],$input,$input]&&array_column($d['bindings'],'PDO_type_code')===[1,2,$mode['PDO_code'],$mode['PDO_code']],'Original aggregate bytes/ID/type/order');}
 }
 $all=[];foreach($s['point_cases']as $c)$all[]=$c['DML'];foreach($s['aggregate_cases']as $c)foreach($c['DML']as $d)$all[]=$d;
 nh_check(count($all)===56,'Exact56 inserts');
 foreach($all as $d){
  nh_check(strpos($d['sql'],'INSERT ')===0&&strpos(strtolower($d['sql']),strtolower($s['table']))!==false&&!preg_match('/YDY_|UPDATE|DELETE|ALTER|TRUNCATE|DROP|COMMIT/i',$d['sql']),'Only new own inserts');
  nh_check(substr_count($d['sql'],'?')===4&&count($d['bindings'])===4,'Exact placeholders');
  foreach($d['bindings']as $b)nh_check($b['transform']==='none'&&in_array($b['PDO_type_code'],[1,2],true),'No hidden input transform/PDO type');
  nh_check(is_int($d['bindings'][0]['original_value'])&&in_array($d['bindings'][0]['original_value'],[1,2],true),'Own IDs1,2 only');
  nh_check($d['bindings'][1]['original_value']===$s['marker'],'Exact marker');
  foreach([2,3]as $i)nh_check(is_string($d['bindings'][$i]['original_value'])&&$d['bindings'][$i]['php_type']==='string','Original lexeme stays string');
 }
 nh_check($s['budget']['DML_attempts']===56&&$s['budget']['DDL']===2&&$s['budget']['rollbacks']===52&&$s['budget']['probe_query_attempt_cap']===360&&$s['budget']['natural_query_attempt_cap']===24,'Frozen caps');
}
function nh_meta_gate(array $m,string $lane):void{
 $cols=$m[0];$want=$lane==='B'?['ID','MARKER','MD','RAW32']:['ID','MARKER','MD_REAL','RAW64'];
 nh_check(array_map('strtoupper',array_column($cols,'column_name'))===$want,'Four ordered own columns');
 foreach($cols as $i=>$c){
  if($lane==='B'){
   nh_check($c['is_nullable']===($i<2?'NO':'YES')&&$c['column_default']===null&&$c['extra']==='','B exact null/default/no auto');
   $type=strtolower($c['column_type']);
   if($i===0)nh_check(preg_match('/^int(?:\(\d+\))?$/',$type)===1,'B signed INT');
   elseif($i===1)nh_check($type==='varchar(16)','B marker16');
   elseif($i===2)nh_check($type==='float(8,2)','B MD float8,2');
   else nh_check($type==='float','B raw plain FLOAT');
  }else{
   nh_check($c['nullable']===($i<2?'N':'Y'),'C exact nullability');
   nh_check($i<2?$c['data_default']===null:$c['data_default']==='NULL','C strict NULL expression only numeric cols');
   $type=strtoupper($c['data_type']);
   if($i===0)nh_check($type==='INT'&&(int)$c['data_length']===4,'C INT');
   elseif($i===1)nh_check($type==='VARCHAR'&&(int)$c['data_length']===16,'C marker16');
   elseif($i===2)nh_check($type==='REAL'&&(int)$c['data_length']===4&&(int)$c['data_precision']===24&&(int)$c['data_scale']===0,'C REAL24 exact');
   else nh_check($type==='FLOAT'&&(int)$c['data_length']===8&&(int)$c['data_precision']===53&&(int)$c['data_scale']===0,'C FLOAT53 exact');
  }
 }
 if($lane==='B'){
  nh_check(count($m[1])===1&&strtoupper($m[1][0]['index_name'])==='PRIMARY'&&(int)$m[1][0]['non_unique']===0&&strtoupper($m[1][0]['column_name'])==='ID','B only PK ID index');
  nh_check(count($m[2])===1&&$m[2][0]['constraint_type']==='PRIMARY KEY','B only PK constraint');
  nh_check(count($m[3])===1&&strtoupper($m[3][0]['column_name'])==='ID'&&$m[3][0]['referenced_table_name']===null,'B no incoming/outgoing FK');
  nh_check($m[4]===[],'B triggers0');$ddl=$m[5][0]['create table']??null;
 }else{
  nh_check(count($m[1])===2,'C exact autogenerated cluster+normal indexes');
  $normal=null;$cluster=null;
  foreach($m[1]as $i){
   nh_check(preg_match('/^INDEX[0-9]+$/D',$i['index_name'])===1,'C generated index name, never old name assumption');
   if($i['index_type']==='CLUSTER'&&$i['uniqueness']==='NONUNIQUE'){$cluster=$i['index_name'];}
   elseif($i['index_type']==='NORMAL'&&$i['uniqueness']==='UNIQUE'){$normal=$i['index_name'];}
   else nh_check(false,'Unexpected C index role/type/uniqueness');
  }
  nh_check($normal!==null&&$cluster!==null&&$normal!==$cluster,'Exactly one cluster/one normal');
  nh_check(count($m[2])===1&&$m[2][0]['index_name']===$normal&&$m[2][0]['column_name']==='ID','C only normal ID indexed column');nh_num($m[2][0]['column_position'],1,'C index pos1');
  nh_check(count($m[3])===1&&$m[3][0]['constraint_type']==='P'&&$m[3][0]['status']==='ENABLED'&&preg_match('/^CONS[0-9]+$/D',$m[3][0]['constraint_name'])===1,'C exact generated enabled PK/no FK');
  nh_check(count($m[4])===1&&$m[4][0]['constraint_name']===$m[3][0]['constraint_name']&&$m[4][0]['column_name']==='ID','C PK ID column');nh_num($m[4][0]['position'],1,'C PK pos1');
  nh_check($m[5]===[],'C triggers0');$ddl=$m[6][0]['ddl']??null;
 }
 nh_check(is_string($ddl)&&stripos($ddl,'CDX_NFH_261011_E2F7')!==false&&stripos($ddl,'CREATE TABLE')!==false&&stripos($ddl,'TEMPORARY')===false,'Exact ordinary definition');
 nh_check(preg_match('/["\x60]MARKER["\x60]\s+VARCHAR\(16(?:\s+CHAR|\s+BYTE)?\)/i',$ddl)===1,'Actual declared marker16');
}
