<?php
declare(strict_types=1);require __DIR__.'/common.php';
$pins=json_decode(file_get_contents(__DIR__.'/execution-pins.json'),true);foreach($pins as $name=>$sha)$check(hash_file('sha256',__DIR__.'/'.$name)===$sha,'Frozen tool/plan pin '.$name);
$plan=json_decode(file_get_contents(__DIR__.'/store-plan-'.$lane.'.json'),true);$check(count($plan['rows'])===2&&$plan['INSERT']===2,'Exact approved store preparation');
$check(!file_exists($runtime.'/fixture-result.json'),'Do not replay Store preparation');$before=$small();$check($before['store']===[]&&$before['rope']===[],'Fresh own store/rope collision zero');
foreach(['rope_skipping','store','user','staff'] as $table){$name=$dm?strtoupper('yoshop_'.$table):'yoshop_'.$table;$tr=$read($dm?'SELECT COUNT(*) n FROM USER_TRIGGERS WHERE TABLE_NAME=?':'SELECT COUNT(*) n FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE=?',[$name]);$fk=$read($dm?"SELECT COUNT(*) n FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE='R' AND (TABLE_NAME=? OR R_CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME=?))":'SELECT COUNT(*) n FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND (TABLE_NAME=? OR REFERENCED_TABLE_NAME=?)',[$name,$name]);$check((int)$tr[0]['n']===0&&(int)$fk[0]['n']===0,'Original FK/trigger remain zero');}
$check(count($before['users'])===2&&count($before['staff'])===2,'Original retained actor counts');foreach($before['users'] as $i=>$u){$check((int)$u['user_id']===$users[$i]&&(int)$u['store_id']===$tenants[$i]&&(int)$u['is_delete']===0&&strpos($u['nick_name'],'CDXLF11F86A_')===0,'Exact marked User lease');$s=$before['staff'][$i];$check((int)$s['id']===$staff[$i]&&(int)$s['user_id']===$users[$i]&&(int)$s['store_id']===$tenants[$i]&&(int)$s['is_delete']===0&&$s['create_by']==='CDXRR11A8F4','Exact retained Staff lease');}
$source=json_decode(file_get_contents(__DIR__.'/source-frozen-sha.json'),true)['files'];foreach($source as $name=>$sha)$check(is_file($root.'/'.$name)&&hash_file('sha256',$root.'/'.$name)===$sha,'Actual whole source freeze '.$name);
$pdo=$connect();$journal=['lane'=>$lane,'before'=>$before,'insert_records'=>[],'committed'=>false];$pdo->beginTransaction();try{foreach($plan['rows'] as $i=>$r){$v=$r['expected'];$check(count($v)===($dm?11:18)&&$v['store_id']===(string)$tenants[$i]&&$v['store_name']==='CDXRE11D7C2_STORE'.($i+1)&&$v['describe']==='CDXRE11D7C2 Rope HTTP fixture'&&$v['host']==='rope'.($i+1).'.exact.invalid','Exact approved Store values');$q=$dm?static function($s){return '"'.strtoupper($s).'"';}:static function($s){return '`'.$s.'`';};$sql='INSERT INTO '.$q('yoshop_store').' ('.implode(',',array_map($q,array_keys($v))).') VALUES ('.implode(',',array_fill(0,count($v),'?')).')';$check($sql===$r['sql'],'Machine Store SQL exact');$s=$pdo->prepare($sql);foreach($r['bindValue'] as $b){$check($b['pdo_type']===PDO::PARAM_STR&&$b['value']===array_values($v)[$b['position']-1],'Approved STR binding');$s->bindValue($b['position'],$b['value'],PDO::PARAM_STR);}$s->execute();$check($s->rowCount()===1,'Store exact affected1');$journal['insert_records'][]=['queryString'=>$s->queryString,'bindValue'=>$r['bindValue'],'rowCount'=>$s->rowCount()];$persist('fixture-journal.json',$journal);}$pdo->commit();$journal['committed']=true;}catch(Throwable $e){if($pdo->inTransaction())$pdo->rollBack();$journal['error']=['class'=>get_class($e),'code'=>$e->getCode(),'message'=>$e->getMessage()];$persist('fixture-journal.json',$journal);throw $e;}
$after=$small();$check($after['users']===$before['users']&&$after['staff']===$before['staff']&&$after['rope']===$before['rope'],'Original own actors/rope unchanged');foreach($after['store'] as $i=>$r){$expected=$plan['rows'][$i]['expected'];$check(count($r)===count($expected),'Full independent Store column count');foreach($expected as $k=>$v)$check(array_key_exists($k,$r)&&(string)$r[$k]===$v,'Independent Store exact '.$k);}
$journal['after']=$after;$persist('fixture-result.json',$journal);echo json_encode(['lane'=>$lane,'committed_store_INSERT'=>2,'independent_full_row_readback'=>true,'source_files'=>count($source),'original_actors_unchanged'=>true,'HTTP'=>0,'DDL'=>0]),"\n";
