<?php
require __DIR__.'/db.php';$report=['lane'=>$lane,'passed'=>false,'DML'=>0,'DDL'=>0,'HTTP'=>0];try{
$inv=json_decode(file_get_contents(__DIR__.'/private-inventory.json'),true);$check($inv['passed'],'Inventory first');$actor=$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($actor)===1,'Actual actor');
$nameSha=$lane==='B'?'f483ba1c130ac167b850ae5099196f085b2f5b7db2faf5787a201eb5f7dbf321':'8b7f1416ace012169e9ac5c94fceb49115287a7006c1f0712ebac2d30af000b4';$candidates=$q('SELECT ID,UUID,NAME FROM '.$p.'staff WHERE NAME LIKE ?',['CDXPAY%']);$marked=array_values(array_filter($candidates,static function($r)use($nameSha){return hash('sha256',$r['name'])===$nameSha;}));$check(count($marked)===1,'Exact existing marked empty Staff');$scopes=['marked_empty'=>$marked[0]];
if($lane==='B'){$groups=$q('SELECT W.STAFF_UUID,COUNT(*) AS CNT FROM '.$p.'member_weight W WHERE EXISTS (SELECT 1 FROM '.$p.'staff S WHERE S.UUID=W.STAFF_UUID) GROUP BY W.STAFF_UUID HAVING COUNT(*) BETWEEN 1 AND 100 ORDER BY W.STAFF_UUID LIMIT 1');if($groups){$staff=$q('SELECT ID,UUID,NAME FROM '.$p.'staff WHERE UUID=?',[$groups[0]['staff_uuid']]);$check(count($staff)===1,'Unique bounded natural Staff');$scopes['natural']=$staff[0];}}
$states=[];foreach($scopes as $label=>$staff){$entry=['staff'=>$staff];foreach(['member_weight','member_weight_status']as $t){$cnt=(int)$q('SELECT COUNT(*) AS CNT FROM '.$p.$t.' WHERE STAFF_UUID=?',[$staff['uuid']])[0]['cnt'];$check($cnt<=100,'Scope cap100');$entry[$t]=$q('SELECT * FROM '.$p.$t.' WHERE STAFF_UUID=? ORDER BY ID',[$staff['uuid']]);$check(count($entry[$t])===$cnt,'Full scope count');}
$authors=array_values(array_unique(array_column($entry['member_weight_status'],'create_by')));$entry['authors']=[];foreach($authors as $uuid){$rows=$q('SELECT ID,UUID,NAME FROM '.$p.'user WHERE UUID=?',[$uuid]);$check(count($rows)<=1,'No duplicate user UUID join');$entry['authors'][$uuid]=$rows;}
foreach(['member_weight'=>'ymd','member_weight_status'=>'create_time']as $t=>$field){$values=array_column($entry[$t],$field);$check(count($values)===count(array_unique($values)),'No source order ties');}
$check($label!=='marked_empty'||($entry['member_weight']===[]&&$entry['member_weight_status']===[]),'Marked scope remains empty');foreach($entry as $v)$check(strlen(json_encode($v))<=2097152,'Source cap2MiB');$states[$label]=$entry;}
$lock=[];foreach(['p/controller/Weight.php','p/logic/Weight.php','model/Weight.php','p/logic/DateMenu.php','p/logic/Rpe.php','m/logic/Dishes.php','model/Staff.php','model/User.php','model/Department.php','model/StaffDepartment.php','model/Project.php','model/ProjectNorm.php','model/ProjectNormExt.php','model/ProjectExt.php','model/SyncFeimao.php','model/BaseModel.php','base/AdminController.php','route.php']as $f)$lock[$f]=hash_file('sha256',__DIR__.'/source/application/'.$f);$save('private-source-lock.json',$lock);$save('private-lease.json',['actor'=>$actor[0],'scopes'=>$scopes,'baseline'=>$states]);
require __DIR__.'/init.php';$check((int)\think\Config::get('pagesize')===10,'Original pagesize10');\think\Config::set('database.debug',true);\think\Db::clear();$queries=[];\think\Db::listen(static function($sql)use(&$queries){$queries[]=$sql;});$logic=new \app\p\logic\Weight();$check(array_filter($queries,static function($s){return !preg_match('/^\s*(SELECT|CALL|SHOW)\b/i',$s);})===[],'Actual constructor no mutation');$report['constructor_sql']=$queries;$check((int)\think\Db::name('member_weight')->where('staff_uuid',$marked[0]['uuid'])->count()===0,'Pure CLI actual PDO access');$report['scopes']=array_map(static function($s)use($hash){return ['staff_uuid_sha256'=>hash('sha256',$s['staff']['uuid']),'rows'=>count($s['member_weight']),'status_rows'=>count($s['member_weight_status']),'source_sha256'=>$hash($s)];},$states);$report['source_lock']=$lock;$report['passed']=true;
}catch(Throwable $e){$save('private-preflight-error.json',['class'=>get_class($e),'message'=>$e->getMessage()]);$report['failure']=['class'=>get_class($e),'reason_sha256'=>hash('sha256',$e->getMessage())];}$save('private-preflight.json',$report);echo json_encode($report,JSON_UNESCAPED_UNICODE),"\n";exit($report['passed']?0:2);
