<?php
require __DIR__.'/db.php';
$report=['lane'=>$lane,'safe'=>false,'http_executions'=>0,'business_dml'=>0,'ddl'=>0];
try {
 if($lane==='B') $check(strpos((string)$db->query('SELECT VERSION()')->fetchColumn(),'5.6.')===0,'MySQL5.6 identity');
 else $check($db->query("SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL")->fetchColumn()==='ZHCT_APP','DM identity');
 $report['identity_verified']=true;
 $actors=$q('SELECT ID,UUID,STAFF_UUID,ACCOUNT,TYPE,IS_DELETE FROM '.$p.'user WHERE ID=(SELECT MIN(ID) FROM '.$p.'user WHERE TYPE=0 AND IS_DELETE=0)');
 $check(count($actors)===1&&(int)$actors[0]['type']===0&&(int)$actors[0]['is_delete']===0&&!empty($actors[0]['uuid']),'Actual active type0 actor');
 $save('private-actor.json',$actors[0]);$report['actor_projection_sha256']=$hash($actors[0]);
 $table=$p.'security_audit_log';
 $columns=$lane==='B'?$q('SELECT COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,EXTRA,DATETIME_PRECISION FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$table]):$q('SELECT COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_SCALE,NULLABLE,DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID',[strtoupper($table)]);
 $report['columns']=$columns;
 $check($columns!==[],'Required audit table absent');
 $names=array_map(static function($r){return strtolower($r['column_name']);},$columns);
 $required=['id','store_id','event_code','event_name','module','action','result','operator','user_uuid','target_type','target_id','message','terminal_ip','request_method','request_path','trace_id','context_json','create_time','is_delete'];
 $report['missing_columns']=array_values(array_diff($required,$names));$check($report['missing_columns']===[],'Required audit columns absent');
 $report['indexes']=$lane==='B'?$q('SELECT INDEX_NAME,NON_UNIQUE,SEQ_IN_INDEX,COLUMN_NAME FROM information_schema.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY INDEX_NAME,SEQ_IN_INDEX',[$table]):$q('SELECT I.INDEX_NAME,I.UNIQUENESS,C.COLUMN_POSITION,C.COLUMN_NAME FROM USER_INDEXES I JOIN USER_IND_COLUMNS C ON I.INDEX_NAME=C.INDEX_NAME WHERE I.TABLE_NAME=? ORDER BY I.INDEX_NAME,C.COLUMN_POSITION',[strtoupper($table)]);
 $report['scope_total']=(int)$db->query('SELECT COUNT(*) FROM '.$table.' WHERE STORE_ID=10001 AND IS_DELETE=0')->fetchColumn();
 // Only one historical row first; raw values stay private, never printed.
 $sql='SELECT ID,EVENT_CODE,CREATE_TIME FROM '.$table.' WHERE STORE_ID=10001 AND IS_DELETE=0 AND CREATE_TIME IS NOT NULL ORDER BY ID ASC';
 $first=$q($lane==='B'?$sql.' LIMIT 1':'SELECT * FROM ('.$sql.') WHERE ROWNUM<=1');
 $save('private-scope-seed.json',$first);$report['historical_seed_available']=$first!==[];
 $report['safe']=true;
} catch(Throwable $e) {$report['failure']=['class'=>get_class($e),'reason'=>$e->getMessage()==='Required audit table absent'?'Required audit table absent':'Preflight gate rejected; private reason hash retained','reason_sha256'=>hash('sha256',$e->getMessage())];}
$save('private-preflight.json',$report);echo json_encode($report,JSON_UNESCAPED_UNICODE),"\n";exit($report['safe']?0:2);
