<?php
require __DIR__.'/common.php';$check(!is_file(__DIR__.'/private-request.json'),'Prepare cannot replay');
$report=['lane'=>$lane,'HTTP'=>0,'DML'=>0,'DDL'=>0];
if($lane==='C'){
 $prior=json_decode(file_get_contents(__DIR__.'/private-preflight.json'),true);$check($prior['passed']&&$prior['counts']['nutrition']===0,'Prior empty gate');$check((int)$q('SELECT COUNT(*) AS CNT FROM '.$p.'nutrition')[0]['cnt']===0,'Fresh empty C; stop drift');
 $columns=$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',['YDY_NUTRITION']);$check($columns===$prior['metadata']['nutrition'],'Fresh complete metadata');
 $check($q('SELECT * FROM USER_TRIGGERS WHERE TABLE_NAME=?',['YDY_NUTRITION'])===[],'Trigger0');
 $ddl=$q("SELECT DBMS_METADATA.GET_DDL('TABLE',?,'ZHCT_APP') AS DDL FROM DUAL",['YDY_NUTRITION']);$check($ddl===($prior['nutrition_table_DDL']??$prior['DDL']),'DDL/identity unchanged');
 $row=['uuid'=>'711DB31A-5BF6-4478-BB9E-C866F0C88DA3','name'=>'CDXNP119A2B-product','synopsis'=>'CDXNP119A2B-readonly','set_uuid'=>'5160CDE0-D0F1-4935-BA5C-33192DB8A20A','use_weight'=>1.25,'use_weight_unit'=>'1','use_number'=>1,'use_number_unit'=>'1','use_time'=>'8B198EC2-A4CD-4FC7-B748-4AA381116AB7','use_method'=>'CDXNP119A2B-method','employ'=>0,'manufacturer'=>'CDXNP119A2B-manufacturer','batching'=>null,'specifications'=>null,'flavor'=>null,'function'=>null,'img_path'=>'','prescription_number'=>null,'power'=>120.5,'carbohydrate'=>12.5,'protein'=>5.25,'fat'=>1.5,'sodium'=>0.25,'status'=>1,'is_del'=>1,'create_time'=>'2001-01-01 01:01:01','create_by'=>'CDXNP119A2B','supplier'=>'CDXNP119A2B-supplier','is_nutrition_station'=>1,'is_own'=>1,'source_img_path'=>'','nutrition_category_uuid'=>'cb28493d-f920-4988-a602-0608076c1a37','app_img'=>''];
 foreach(['nutrition_set'=>$row['set_uuid'],'nutrition_time'=>$row['use_time'],'nutrition_category'=>$row['nutrition_category_uuid']] as $t=>$ref){$actual=$q('SELECT * FROM '.$p.$t.' WHERE UUID=?',[$ref]);$check(count($actual)===1,'Same library reference '.$t);$original=json_decode(file_get_contents(__DIR__.'/private-'.$t.'-rows.json'),true);$matches=array_values(array_filter($original,static function($r)use($ref){return $r['uuid']===$ref;}));$check($actual===$matches,'Reference full-row unchanged '.$t);}
 $check((int)$q('SELECT COUNT(*) AS CNT FROM '.$p.'nutrition WHERE UUID=? OR NAME=? OR CREATE_BY=?',[$row['uuid'],$row['name'],$row['create_by']])[0]['cnt']===0,'Marker conflict0');
 $db->beginTransaction();try{$sql='INSERT INTO '.$p.'nutrition ('.implode(',',array_map(static function($k){return '"'.strtoupper($k).'"';},array_keys($row))).') VALUES ('.implode(',',array_fill(0,count($row),'?')).')';$s=$db->prepare($sql);foreach(array_values($row) as $i=>$v)$s->bindValue($i+1,$v,$v===null?PDO::PARAM_NULL:(is_int($v)?PDO::PARAM_INT:PDO::PARAM_STR));$s->execute();$check($s->rowCount()===1,'One approved row');$journal=['queryString'=>$s->queryString,'bindings'=>$row,'affected'=>$s->rowCount()];$db->commit();}catch(Throwable $e){if($db->inTransaction())$db->rollBack();throw $e;}$save('private-fixture-insert.json',$journal);$report['DML']=1;
}
$base=$source();$expectedActor=$lane==='B'?'1e449c21aa9f6146a1072d67ad4d8f9ae0a554d5de37e8d98587f7b0cf7ce347':'77454e3bffe2f330d0cd94db97b80553f7c7fcd7ab778e03e7cdad7562f46523';$check($base['actor_sha256']===$expectedActor,'Same previously approved real actor');$save('private-http-baseline.json',$base);
require __DIR__.'/media-leaf.php';require __DIR__.'/init.php';$GLOBALS['CDX_PREPARED']=[];new \app\p\logic\Nutrition();new \app\m\logic\Nutrition();new \app\model\File();$check($GLOBALS['CDX_PREPARED']===[],'Constructor0SQL');
$actor=$q('SELECT ID,UUID,ACCOUNT,TYPE,IS_DELETE FROM '.$p.'user WHERE ID=1')[0];require_once APP_PATH.'base/Security.php';$token=\app\base\Security::encrypt(implode("\t",[(string)$actor['id'],(string)$actor['uuid'],(string)$actor['account'],'0','','',(string)$actor['account']]));
$cases=[];foreach(['p','m'] as $module){$params=['page'=>'1','pagesize'=>'10','search_type'=>'1','keyword'=>$keyword];if($module==='p')$params['set_uuid']=$setUUID;$cases[]=['label'=>$module.'Lists','path'=>'/'.$module.'/nutrition/lists','params'=>$params];$cases[]=['label'=>$module.'Info','path'=>'/'.$module.'/nutrition/info','params'=>['uuid'=>$uuid]];$cases[]=['label'=>$module.'Time','path'=>'/'.$module.'/nutrition/useTimeList','params'=>['flag'=>'1','uuid'=>$uuid]];$cases[]=['label'=>$module.'Supplier','path'=>'/'.$module.'/nutrition/supplierList','params'=>['nutrition'=>'0']];}
$cases[]=['label'=>'mProduct','path'=>'/m/nutrition/product','params'=>['page'=>'1','pagesize'=>'10','value'=>$keyword]];$cases[]=['label'=>'mGroup','path'=>'/m/nutrition/NutritionUseTimeGroup','params'=>['uuid'=>$uuid]];
$save('private-request.json',['token'=>$token,'cases'=>$cases]);$save('private-cases.json',$cases);
$lock=[];foreach(['p/controller/Nutrition.php','m/controller/Nutrition.php','p/logic/Nutrition.php','m/logic/Nutrition.php','model/Nutrition.php','model/NutritionSet.php','model/NutritionTime.php','model/NutritionCategory.php','model/BaseModel.php','base/AdminController.php','common.php','route.php'] as $f)$lock[$f]=hash_file('sha256',APP_PATH.$f);$save('private-source-lock.json',$lock);
$report['passed']=true;$save('private-prepare.json',$report);echo json_encode($report),"\n";
