<?php
declare(strict_types=1);
require __DIR__.'/bootstrap.php';
$private=json_decode((string)file_get_contents($runtime.'/private-retention.json'),true);
$check($private['marker']===$marker&&$private['tenant']===$tenant,'Retained identity');
$ownedIds=$private['owned_primary_keys'];$sid=$private['staff_id'];$uid=$private['user_id'];$verifiedCounts=[];
foreach($tables as $t){$pk=$t==='user'?'user_id':'id';$isLarge=in_array($t,['meal_recommend','meal_recommend_history'],true);$rows=$query('SELECT * FROM yoshop_'.$t.' WHERE '.($isLarge?'staff_id=? AND ':'').'store_id=? ORDER BY '.$pk,$isLarge?[$sid,$tenant]:[$tenant]);$verifiedCounts[$t]=count($rows);$check(array_map('intval',array_column($rows,$pk))===($ownedIds[$t]??[]),'Fresh original retained exact PKs '.$t);foreach($rows as $r){if($t==='user')$check($r['nick_name']===$marker.'_USER','Own User marker');elseif($t==='staff')$check((int)$r['id']===$sid&&(int)$r['user_id']===$uid&&$r['create_by']===$marker,'Own Staff chain');else $check((int)$r['staff_id']===$sid,'Own staff relation '.$t);}}
$cases=$private['cases'];$planId=0;$wireChecked=0;
foreach($cases as $c){
    if($c['scenario']!=='PILOT_NT_GREEN_PLAN_LIST_NONEMPTY')continue;
    $list=$c['body']['data']['list'];$check($list['total']===1&&$list['per_page']===10&&$list['current_page']===1&&$list['last_page']===1&&count($list['data'])===1,'Exact pagination');$wire=$list['data'][0];$planId=$wire['id'];
    $check(is_int($planId)&&in_array($planId,$ownedIds['nurtrition'],true),'Actual independently owned plan ID');$rows=$query('SELECT * FROM yoshop_nurtrition WHERE id=? AND staff_id=? AND store_id=?',[$planId,$sid,$tenant]);$check(count($rows)===1,'Single retained plan source');$r=$rows[0];
    foreach(['id','user_id','staff_id','unit_id','store_id','is_delete'] as $k)$r[$k]=(int)$r[$k];
    $check($r['is_delete']===1&&$wire['is_delete']===0,'Actual soft-delete after list retained');
    foreach($r as $k=>$v){if($k==='is_delete'||$k==='update_time')continue;if($k==='create_time')$v=date('Y-m-d H:i:s',strtotime((string)$v));$check(array_key_exists($k,$wire)&&$wire[$k]===$v,'Complete original plan list value/type '.$k);$wireChecked++;}
    $check(array_keys($wire)===array_keys($r),'Original plan all columns/order');
    $check(is_string($wire['update_time'])&&strtotime($wire['update_time'])!==false&&strtotime($wire['update_time'])>=strtotime($wire['create_time'])&&strtotime($wire['update_time'])<=strtotime((string)$r['update_time']),'List timestamp pre-delete original window');
}
$check($planId>0,'Nonempty list actual original proof');
foreach($private['proofs'] as $proof){if($proof['kind']!=='target')continue;$r=$proof['values'];$actual=$query('SELECT * FROM yoshop_nurtition_target WHERE id=? AND staff_id=? AND store_id=?',[$r['id'],$sid,$tenant]);$check(count($actual)===1,'Target proof time owner');$check(strtotime($r['create_time'])===strtotime((string)$actual[0]['create_time']),'Original creation time unchanged');$check(strtotime($r['update_time'])>=strtotime($r['create_time'])&&strtotime($r['update_time'])<=strtotime((string)$actual[0]['update_time']),'Original update time bounded by exact retained source');}
$normalize=static function($x,string $context='')use(&$normalize,$ownedIds,$sid,$planId){
    if(!is_array($x))return $x;if(isset($x['path']))$context=strpos($x['path'],'NutritionTarget')!==false?'target':'plan';if(($x['kind']??'')==='target')$context='target';
    foreach($x as $k=>&$v){if($k==='staff_id'&&$v===$sid)$v=1;
        elseif($k==='id'&&is_int($v)&&$context==='target'&&in_array($v,$ownedIds['nurtition_target'],true))$v=array_search($v,$ownedIds['nurtition_target'],true)+1;
        elseif($k==='id'&&is_int($v)&&$context==='plan'&&$v===$planId)$v=1;
        elseif(in_array($k,['create_time','update_time'],true)&&is_string($v)&&preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(?:\.\d{1,6})?$/D',$v))$v='VERIFIED_OWN_ORIGINAL_TIME';else $v=$normalize($v,$context);
    }unset($v);return $x;
};
foreach($cases as &$c){$trace=$c['body']['trace_id']??null;$c['trace_format_valid']=is_string($trace)&&preg_match('/^[0-9a-f]{13}$/D',$trace)===1;$check($c['trace_format_valid'],'Valid trace');$c['body']['trace_id']='VALID_DYNAMIC_TRACE';}unset($c);
$report=json_decode((string)file_get_contents($runtime.'/report.json'),true);$report['cases']=$normalize($cases);$report['original_proofs']=$normalize($private['proofs']);$report['jobs']=$normalize($private['jobs']);
$check($snapshot()===$private['before'],'Final small natural tables exact-owned-PK exclusion SHA');$report['retention']['natural_small_sha_unchanged']=true;
$report['independent_final_original_verification']=['all_retained_exact_pks_verified'=>true,'owned_user_staff_chain_verified'=>true,'plan_list_all_columns_verified'=>true,'plan_list_pre_delete_active_and_post_delete_soft_flag_verified'=>true,'plan_list_fields_verified'=>$wireChecked,'plan_id_mapping_only_after_original_ownership'=>true,'row_array_order_unchanged'=>true];
$report['source_boundary']['nutrition_model_sha']=hash_file('sha256',__DIR__.'/source/app/store/model/nutrition/Nutrition.php');$report['source_boundary']['target_service_sha']=hash_file('sha256',__DIR__.'/source/app/store/service/nutrition/NutritionTarget.php');
$report['retention']['fresh_pdo_exact_pk_verified']=true;
$report['publish_count']=count(file($runtime.'/publish-captures.jsonl',FILE_SKIP_EMPTY_LINES)?:[]);$report['robot_count']=count(file($runtime.'/robot-captures.jsonl',FILE_SKIP_EMPTY_LINES)?:[]);
if(isset($report['source_identity_reprobe']))$report['source_identity_reprobe']['job_capture_provenance']='copied unchanged original green Job logs; reprobe executes no Job';
if($lane==='B'){
    $red=[];foreach($private['parent_red']['cases'] as $c)$red[$c['scenario']]=$c;$paired=[];
    foreach($private['cases'] as $c){$key=$c['scenario'];$old=null;
        if($key==='PILOT_NT_GREEN_TARGET_EMPTY')$old='PILOT_NT_TARGET_EMPTY_ORIGINAL_PC';
        elseif($key==='PILOT_NT_GREEN_TARGET_DETAIL_20300402')$old='PILOT_NT_TARGET_DETAIL_20300402';
        elseif($key==='PILOT_NT_GREEN_TARGET_DETAIL_20300403')$old='PILOT_NT_TARGET_MIDDLE_UPDATED';
        elseif($key==='PILOT_NT_GREEN_TARGET_DETAIL_20300404')$old='PILOT_NT_TARGET_DETAIL_20300404';
        elseif($key==='PILOT_NT_GREEN_TARGET_DETAIL_'.str_replace('-','',$private['date']))$old='PILOT_NT_TARGET_TODAY_DETAIL';
        if($old===null)continue;
        $left=$red[$old];foreach([&$left,&$c] as &$pair){$t=$pair['body']['trace_id'];$check(preg_match('/^[0-9a-f]{13}$/D',$t)===1,'Original baseline trace');$pair['body']['trace_id']='VALID_DYNAMIC_TRACE';}unset($pair);
        $check($normalize($left['body'],'target')===$normalize($c['body'],'target'),'Original MySQL before/after wire '.$key);$check($left['raw_json_shape']===$c['raw_json_shape'],'Original raw shape unchanged '.$key);$paired[]=['before'=>$old,'after'=>$key,'complete_body_value_type_equal'=>true,'raw_object_array_shape_equal'=>true];
    }$check(count($paired)===5,'Five unchanged MySQL detail baselines');$report['mysql_original_before_after_wire']=$paired;
}
file_put_contents($runtime.'/green-evidence.json',json_encode($report,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES));
echo json_encode(['lane'=>$lane,'final_original_verification'=>true,'http_cases'=>count($cases),'original_plan_fields'=>$wireChecked,'retained_counts'=>$verifiedCounts]),"\n";
