<?php
require __DIR__.'/db.php';$report=['lane'=>$lane,'HTTP'=>0,'DML'=>0,'DDL'=>0,'passed'=>false];
try{$check(!is_file(__DIR__.'/private-fixture-insert.json'),'Successful fixture inserts cannot replay');$fixtures=json_decode(file_get_contents(__DIR__.'/fixtures.json'),true)[$lane];$prior=json_decode(file_get_contents(__DIR__.'/private-preflight.json'),true);$check($prior['passed'],'Preflight passed');
 foreach($fixtures as $table=>$row){$name=$lane==='B'?$p.$table:strtoupper($p.$table);$check((int)$q('SELECT COUNT(*) AS CNT FROM '.$p.$table)[0]['cnt']===0,'Fresh target empty '.$table);$columns=$lane==='B'?$q('SELECT COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,EXTRA,COLUMN_KEY,CHARACTER_MAXIMUM_LENGTH,DATETIME_PRECISION FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$name]):$q('SELECT COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_PRECISION,DATA_SCALE,NULLABLE,DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID',[$name]);$check($columns===$prior['tables'][$table]['columns'],'Metadata unchanged '.$table);$keys=array_keys($row);sort($keys);$expected=[];foreach($columns as $column)if(strtolower($column['column_name'])!=='id')$expected[]=strtolower($column['column_name']);sort($expected);$check($keys===$expected,'All non-PK fields '.$table);
  $triggers=$lane==='B'?$q('SELECT * FROM information_schema.TRIGGERS WHERE EVENT_OBJECT_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE=?',[$name]):$q('SELECT * FROM USER_TRIGGERS WHERE TABLE_NAME=?',[$name]);$check($triggers===[],'Trigger0 '.$table);
  $constraints=$lane==='B'?$q('SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?',[$name]):$q('SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME=?',[$name]);$check($constraints===$prior['tables'][$table]['constraints'],'Constraint signature unchanged '.$table);$keys=$lane==='B'?$q('SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?',[$name]):$q('SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME=?',[$name]);$check($keys===$prior['tables'][$table]['keys'],'PK/FK/UUID key signature unchanged '.$table);if($lane==='C')$check($q("SELECT DBMS_METADATA.GET_DDL('TABLE',?,'ZHCT_APP') AS DDL FROM DUAL",[$name])===$prior['tables'][$table]['table_DDL'],'DDL/auto identity unchanged '.$table);
 }
 $productUUID=$lane==='B'?'6969DC3F-CC71-237D-FCED-389B86C5905F':'711DB31A-5BF6-4478-BB9E-C866F0C88DA3';$product=$q('SELECT * FROM '.$p.'nutrition WHERE UUID=?',[$productUUID]);$check($product===json_decode(file_get_contents(__DIR__.'/private-product-row.json'),true),'Exact prior product reference');$times=$q('SELECT * FROM '.$p.'nutrition_time ORDER BY ID');$check($times===json_decode(file_get_contents(__DIR__.'/private-time-rows.json'),true),'Exact prior Time reference');if($lane==='B')$check($q('SELECT * FROM '.$p.'nutrition_station ORDER BY ID')===json_decode(file_get_contents(__DIR__.'/private-nutrition_station-rows.json'),true),'Natural Station unchanged');
 $journal=[];$db->beginTransaction();try{foreach($fixtures as $table=>$row){if(isset($row['uuid']))$check((int)$q('SELECT COUNT(*) AS CNT FROM '.$p.$table.' WHERE UUID=?',[$row['uuid']])[0]['cnt']===0,'UUID conflict0');$quote=$lane==='B'?'`':'"';$sql='INSERT INTO '.$p.$table.' ('.implode(',',array_map(static function($key)use($quote){return $quote.strtoupper($key).$quote;},array_keys($row))).') VALUES ('.implode(',',array_fill(0,count($row),'?')).')';$statement=$db->prepare($sql);foreach(array_values($row) as $i=>$value)$statement->bindValue($i+1,$value,$value===null?PDO::PARAM_NULL:(is_int($value)?PDO::PARAM_INT:PDO::PARAM_STR));$statement->execute();$check($statement->rowCount()===1,'One approved inserted row');$journal[]=['table'=>$table,'queryString'=>$statement->queryString,'bindings'=>$row,'affected'=>$statement->rowCount()];}$db->commit();}catch(Throwable $e){if($db->inTransaction())$db->rollBack();throw $e;}
 $save('private-fixture-insert.json',$journal);$report['DML']=count($journal);$report['passed']=true;
}catch(Throwable $e){$save('private-prepare-error.json',['class'=>get_class($e),'message'=>$e->getMessage(),'trace'=>$e->getTraceAsString()]);$report['failure']=['class'=>get_class($e),'reason_sha256'=>hash('sha256',$e->getMessage())];}
$save('private-prepare.json',$report);$save('private-prepare-select-journal.json',$GLOBALS['ORACLE_JOURNAL']);echo json_encode($report),"\n";exit($report['passed']?0:2);
