<?php
declare(strict_types=1);
require __DIR__.'/gate.php';
umask(0077);
$lane=getenv('NH_LANE');$root=getenv('NH_ROOT');
$plan=nh_load(__DIR__.'/plan.json');nh_shape($plan,$lane);$spec=$plan['lanes'][$lane];
$log=__DIR__.'/private-run-'.$lane.'.jsonl';$h=fopen($log,'xb');nh_check($h!==false,'Never overwrite/replay raw');chmod($log,0600);
$seq=0;$probe=0;$naturalCount=0;$dml=0;$ddl=0;$rollbackCount=0;$cases=0;$created=false;$createdMeta=null;$unknown=false;$db=null;$cfg=null;
$emit=static function(string $event,array $data=[])use($h,&$seq,$lane):void{
 $s=json_encode(['seq'=>++$seq,'utc'=>gmdate('c'),'lane'=>$lane,'event'=>$event,'data'=>$data],JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION|JSON_THROW_ON_ERROR)."\n";
 nh_check(fwrite($h,$s)===strlen($s)&&fflush($h),'Durable event append');
};
$err=static function(Throwable $e):array{return ['class'=>get_class($e),'code'=>$e->getCode(),'message'=>$e->getMessage(),'errorInfo'=>$e instanceof PDOException?($e->errorInfo??null):null];};
$typed=static function($v):array{$r=['php_type'=>gettype($v),'value'=>$v];if(is_float($v)){$r['float17g']=sprintf('%.17g',$v);$r['native_double_hex']=bin2hex(pack('d',$v));$r['byte_order']=bin2hex(pack('L',1))==='01000000'?'little':'big';}return $r;};
$params=static function(array $bs)use($typed):array{
 $out=[];foreach($bs as $b){$v=array_key_exists('original_value',$b)?$b['original_value']:$b['value'];
 $type=$b['PDO_type_code']??(($b['pdo_type']??'')==='PDO::PARAM_INT'?1:2);
 $out[]=['original'=>$b,'runtime'=>$typed($v),'value'=>$v,'pdo_type_code'=>$type];}return $out;
};
$connect=static function()use(&$cfg):PDO{
 $options=[PDO::ATTR_CASE=>PDO::CASE_LOWER,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_ORACLE_NULLS=>PDO::NULL_NATURAL,PDO::ATTR_STRINGIFY_FETCHES=>false,PDO::ATTR_EMULATE_PREPARES=>false];
 foreach(($cfg['params']??[])as $k=>$v)$options[$k]=$v;
 return new PDO($cfg['_nh_dsn'],$cfg['username'],$cfg['password'],$options);
};
$query=static function(PDO $pdo,string $sql,array $bs=[],string $bucket='probe',int $rowCap=256,bool $inspect=false)use(&$probe,&$naturalCount,$params,$typed,$emit,$err):array{
 nh_check(strpos($sql,'SELECT ')===0||strpos($sql,'SHOW WARNINGS')===0||strpos($sql,'SHOW CREATE TABLE')===0,'Read-only diagnostic SQL');
 if($bucket==='natural')nh_check(++$naturalCount<=24,'Natural cap24');else nh_check(++$probe<=360,'Probe cap360');
 $actual=$params($bs);$emit('read-start',['sql'=>$sql,'parameters'=>$actual,'bucket'=>$bucket]);
 try{
  $s=$pdo->prepare($sql);foreach($actual as $i=>$v)nh_check($s->bindValue($i+1,$v['value'],$v['pdo_type_code']),'Read bind');
  $s->execute();$executeError=$s->errorInfo();$rows=[];$types=[];$bytes=0;
  while(($r=$s->fetch(PDO::FETCH_ASSOC))!==false){$r=array_change_key_case($r,CASE_LOWER);foreach($r as &$v)if(is_resource($v))$v=stream_get_contents($v);unset($v);
   $rows[]=$r;$types[]=array_map($typed,$r);$bytes+=strlen(json_encode($r,JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION));nh_check(count($rows)<=$rowCap&&$bytes<=524288,'Result row/512KB cap');}
  $metadata=['requested'=>$inspect];
  if($inspect){
   $getterWarnings=[];set_error_handler(static function($severity,$message,$file,$line)use(&$getterWarnings){$getterWarnings[]=['severity'=>$severity,'message'=>$message,'file'=>$file,'line'=>$line];return true;});
   try{$columns=[];for($i=0;$i<$s->columnCount();$i++){$c=$s->getColumnMeta($i);if($c===false){$metadata=['requested'=>true,'supported'=>false,'errorInfo'=>$s->errorInfo()];break;}$columns[]=$c;}if(count($columns)===$s->columnCount())$metadata=['requested'=>true,'supported'=>true,'columns'=>$columns];}
   catch(Throwable $e){$metadata=['requested'=>true,'supported'=>false,'error'=>$err($e)];}finally{restore_error_handler();}
   $metadata['PHP_getter_warnings']=$getterWarnings;
  }
  $s->closeCursor();$emit('read-success',['sql'=>$sql,'rows'=>$rows,'typed_rows'=>$types,'row_count'=>count($rows),'execute_errorInfo'=>$executeError,'column_metadata'=>$metadata]);return $rows;
 }catch(Throwable $e){$emit('read-failure',['sql'=>$sql,'error'=>$err($e)]);throw $e;}
};
$meta=static function(PDO $pdo)use($spec,$query):array{$m=[];foreach($spec['schema_queries']as $q)$m[]=$query($pdo,$q['sql'],$q['bindings'],'probe',$q['max_rows']);return $m;};
$natural=static function(PDO $pdo)use($spec,$query):array{$m=[];foreach($spec['natural_queries']as $q)$m[]=$query($pdo,$q['sql'],$q['bindings'],'natural',$q['max_rows']);return $m;};
$zero=static function(PDO $pdo)use($spec,$query):void{$r=$query($pdo,$spec['templates']['count'],[],'probe',1);nh_check(count($r)===1,'Zero shape');nh_num($r[0]['n'],0,'Own row0');};
$ddlExec=static function(string $sql)use(&$db,&$ddl,&$unknown,$spec,$emit,$err):void{
 nh_check(in_array($sql,[$spec['templates']['create'],$spec['templates']['drop']],true)&&++$ddl<=2,'Exact2 DDL');
 $emit('DDL-start',['sql'=>$sql,'sha256'=>hash('sha256',$sql)]);try{$s=$db->prepare($sql);$s->execute();$emit('DDL-success',['sql'=>$sql,'errorInfo'=>$s->errorInfo()]);$s->closeCursor();}
 catch(Throwable $e){$unknown=true;$emit('DDL-failure-unknown',['sql'=>$sql,'error'=>$err($e)]);throw $e;}
};
$insert=static function(array $op,string $case)use(&$db,&$dml,$params,$emit,$err,$lane,$query):void{
 nh_check(++$dml<=56,'INSERT cap56');$actual=$params($op['bindings']);$emit('DML-start',['case_id'=>$case,'sql'=>$op['sql'],'parameters'=>$actual,'original_nutrient_values'=>$op['original_nutrient_values']]);
 try{$s=$db->prepare($op['sql']);foreach($actual as $i=>$v)nh_check($s->bindValue($i+1,$v['value'],$v['pdo_type_code']),'Original typed insert binding');nh_check($s->execute(),'Insert succeeded');$emit('DML-success',['case_id'=>$case,'rowCount'=>$s->rowCount(),'errorInfo'=>$s->errorInfo()]);$s->closeCursor();}
 catch(Throwable $e){$emit('DML-failure',['case_id'=>$case,'error'=>$err($e)]);throw $e;}
 if($lane==='B'){$w=$query($db,'SHOW WARNINGS',[],'probe',11);$emit('warnings',['case_id'=>$case,'rows'=>$w,'overflow'=>count($w)>10]);nh_check(count($w)<=10,'Warning overflow');}
};
$rollback=static function()use(&$db,&$rollbackCount,$emit,$zero):void{nh_check(++$rollbackCount<=52,'Rollback cap52');$emit('rollback-start');nh_check($db->rollBack(),'Own rollback');$emit('rollback-success');$zero($db);};
try{
 if($lane==='B'){
  define('BUSINESS','');define('APP_PATH','/workspace/zhct/zhctproject/store/application/');define('TP_ENV','local');
  $load=static function(string $file):array{return require $file;};
  $cfg=$load(APP_PATH.'database.php');$local=$load(APP_PATH.'config/local/database.php');
  foreach(['hostname','database','username','password']as $k)nh_check(($cfg[$k]??null)===($local[$k]??null),'Effective scope key '.$k);
  nh_check($cfg['charset']==='utf8'&&(string)$cfg['hostport']==='3306'&&$cfg['params']===[],'Exact real effective base->local configuration');
  nh_check(!array_key_exists('charset',$local)&&!array_key_exists('hostport',$local),'Local-only not confused with effective config');
  $cfg['_nh_dsn']='mysql:host='.$cfg['hostname'].';port='.$cfg['hostport'].';dbname='.$cfg['database'].';charset='.$cfg['charset'];
  $emit('B-effective-config',['real_loader_constants'=>true,'effective_charset'=>'utf8','effective_port'=>3306,'params_keys'=>[],'has_initSQL'=>false,'four_keys_match_local'=>true,'local_has_charset'=>false,'local_has_hostport'=>false]);
 }else{
  nh_check($root==='/tmp/zhct-dm-poc-20260928.fcpiiN/store','Exact C original root');
  $cfg=(static function(string $file):array{return require $file;})($root.'/application/database.php');
  nh_check($cfg['hostname']==='127.0.0.1'&&(string)$cfg['hostport']==='5237'&&$cfg['database']==='ZHCT_APP','Nonproduction C identity scope');
  $cfg['_nh_dsn']='dm:host=127.0.0.1;port=5237;schema=ZHCT_APP';
 }
 nh_check(!isset($cfg['params'][1002]),'No unapproved initSQL');
 $db=$connect();$emit('connection-confirmed',['php'=>PHP_VERSION,'int_size'=>PHP_INT_SIZE,'precision'=>ini_get('precision'),'serialize_precision'=>ini_get('serialize_precision'),'plan_sha256'=>NH_SHA,'runner_sha256'=>hash_file('sha256',__FILE__),'gate_sha256'=>hash_file('sha256',__DIR__.'/gate.php')]);
 $attributes=[];foreach([PDO::ATTR_DRIVER_NAME,PDO::ATTR_CLIENT_VERSION,PDO::ATTR_SERVER_VERSION,PDO::ATTR_EMULATE_PREPARES,PDO::ATTR_STRINGIFY_FETCHES,PDO::ATTR_CASE,PDO::ATTR_ERRMODE,PDO::ATTR_PERSISTENT]as $a){try{$attributes[$a]=['supported'=>true,'value'=>$db->getAttribute($a)];}catch(Throwable $e){$attributes[$a]=['supported'=>false,'error'=>$err($e)];}}$emit('PDO-attributes',['attributes'=>$attributes]);
 foreach($spec['identity_queries']as $q){$r=$query($db,$q['sql'],$q['bindings'],'probe',$q['max_rows']);if($lane==='B'){nh_check($r[0]['version']==='5.6.50-log','Exact source version');nh_check($r[0]['cs_client']==='utf8'&&$r[0]['cs_connection']==='utf8','Effective application charset reached real session');}elseif(isset($r[0]['schema_name']))nh_check($r[0]['schema_name']==='ZHCT_APP','C schema exact');}
 $before=$natural($db);$emit('natural-before',['sha256'=>hash('sha256',json_encode($before,JSON_PRESERVE_ZERO_FRACTION))]);
 nh_check($query($db,$spec['collision_sql'],$spec['collision_bindings'],'probe',32)===[],'Own name collision0');
 foreach(array_slice($spec['schema_queries'],0,-1)as $q)nh_check($query($db,$q['sql'],$q['bindings'],'probe',$q['max_rows'])===[],'Own absent catalog0');
 $emit('preflight-complete',['DDL'=>0,'DML'=>0,'probe'=>$probe,'natural'=>$naturalCount]);
 $ddlExec($spec['templates']['create']);$created=true;$createdMeta=$meta($db);nh_meta_gate($createdMeta,$lane);
 $emit('created-schema-gate',['metadata'=>$createdMeta,'sha256'=>hash('sha256',json_encode($createdMeta,JSON_PRESERVE_ZERO_FRACTION)),'passed'=>true]);
 foreach(['native_point','native_rows','text_point','decimal30_point','computed_point','aggregate_native','aggregate_text_decimal30','count','warnings']as $name){
  $sql=$spec['templates'][$name];if($sql===null)continue;nh_check(++$probe<=360,'Compile diagnostic cap');
  $emit('prepare-only-start',['template'=>$name,'sql'=>$sql]);try{$s=$db->prepare($sql);$emit('prepare-only-success',['template'=>$name,'sql'=>$sql,'errorInfo'=>$s->errorInfo()]);$s->closeCursor();}catch(Throwable $e){$emit('prepare-only-failure',['template'=>$name,'sql'=>$sql,'error'=>$err($e)]);throw $e;}
 }
 foreach($spec['point_cases']as $case){
  nh_check($db->beginTransaction(),'Begin point');$emit('case-start',['case_id'=>$case['case_id'],'kind'=>'point']);
  $insert($case['DML'],$case['case_id']);
  foreach(['native_point','text_point','decimal30_point','computed_point']as $name)$query($db,$spec['templates'][$name],$spec['point_read_bindings'],'probe',1,true);
  $rollback();$cases++;$emit('case-complete',['case_id'=>$case['case_id'],'case_count'=>$cases]);
 }
 foreach($spec['aggregate_cases']as $case){
  nh_check($db->beginTransaction(),'Begin aggregate pair');$emit('case-start',['case_id'=>$case['case_id'],'kind'=>'aggregate']);
  foreach($case['DML']as $op)$insert($op,$case['case_id']);
  $query($db,$spec['templates']['native_rows'],$spec['pair_read_bindings'],'probe',2,true);
  $query($db,$spec['templates']['computed_point'],$spec['point_read_bindings'],'probe',1,true);
  foreach(['aggregate_native','aggregate_text_decimal30']as $name)$query($db,$spec['templates'][$name],$spec['pair_read_bindings'],'probe',1,true);
  $rollback();$cases++;$emit('case-complete',['case_id'=>$case['case_id'],'case_count'=>$cases]);
 }
 nh_check($dml===56&&$cases===52&&$rollbackCount===52,'Original fixed sequence fully completed');
 $zero($db);$independent=$connect();$zero($independent);
 $own=$meta($db);$other=$meta($independent);nh_meta_gate($own,$lane);nh_meta_gate($other,$lane);nh_check($createdMeta===$own&&$createdMeta===$other,'Actual CREATE full metadata/DDL unchanged in independent connection');
 $emit('cleanup-ownership-gate',['metadata_sha256'=>hash('sha256',json_encode($createdMeta,JSON_PRESERVE_ZERO_FRACTION)),'independent_zero'=>true,'actual_names_pinned'=>true]);
 $ddlExec($spec['templates']['drop']);$created=false;
 $r=$query($independent,$spec['drop_catalog0_sql'],$spec['drop_catalog0_bindings'],'probe',1);nh_num($r[0]['n'],0,'Fresh object0');$emit('cleanup-complete',['fresh_object_count'=>0]);
 $after=$natural($db);$equal=$before===$after;$emit('natural-after',['sha256'=>hash('sha256',json_encode($after,JSON_PRESERVE_ZERO_FRACTION)),'equals_before'=>$equal,'drift'=>$equal?'none':'external_or_unattributed_no_restore']);
 $emit('complete',['cases'=>$cases,'DDL'=>$ddl,'INSERT_attempts'=>$dml,'rollbacks'=>$rollbackCount,'probe_queries'=>$probe,'natural_queries'=>$naturalCount,'natural_equal'=>$equal,'object0'=>true,'C_warning_status'=>$lane==='C'?'unknown':'not-applicable']);
 echo json_encode(['lane'=>$lane,'status'=>'COMPLETE','cases'=>$cases,'DDL'=>$ddl,'INSERT_attempts'=>$dml,'probe_queries'=>$probe,'natural_queries'=>$naturalCount,'raw_sha256'=>hash_file('sha256',$log)]),"\n";
}catch(Throwable $e){
 $emit('stopped',['error'=>$err($e),'unknown'=>$unknown,'created'=>$created,'cases'=>$cases,'DDL'=>$ddl,'INSERT_attempts'=>$dml,'rollbacks'=>$rollbackCount,'probe_queries'=>$probe,'natural_queries'=>$naturalCount]);
 if($db!==null){try{if($db->inTransaction()){$emit('emergency-owned-rollback-start');$db->rollBack();$emit('emergency-owned-rollback-success');}}catch(Throwable $r){$emit('emergency-rollback-failure',['error'=>$err($r)]);}}
 echo json_encode(['lane'=>$lane,'status'=>'STOPPED','created'=>$created,'cases'=>$cases,'DDL'=>$ddl,'INSERT_attempts'=>$dml,'raw_sha256'=>hash_file('sha256',$log)]),"\n";exit(2);
}
