<?php
require __DIR__.'/db.php';$phase=$argv[1]??'base';$module=$argv[2]??'';$check(isset($modules[$module]),'Frozen module');$pre=json_decode(file_get_contents(__DIR__.'/private-preflight.json'),true);$check($pre['tables'][$module]['safe'],'Unsafe source');$lease=json_decode(file_get_contents(__DIR__.'/private-lease.json'),true);$own=is_file(__DIR__.'/private-own.json')?json_decode(file_get_contents(__DIR__.'/private-own.json'),true):[];$marker=$lease['marker'];$row=$own[$module]??null;
$base=['staff_uuid'=>$lease['staff']['uuid'],'feeding_date'=>'2010-01-02','feeding_coach'=>'明远教练','feeding_achievement'=>'综合体能达标','feeding_situation'=>$marker."输送记录'初始\n末行"];
$updated=$base;$updated['feeding_date']='2010-01-03';$updated['feeding_coach']='远航教练';$updated['feeding_achievement']='专项能力达标';$updated['feeding_situation']=$marker."输送记录'更新\n末行";
if($row){$updated['uuid']=$row['uuid'];if(false)$updated['id']=$row['id'];}
$spec=[];$add=static function($label,$action,$params,$code=0)use(&$spec,$module){$spec[]=['label'=>$module.'.'.$label,'action'=>$action,'params'=>$params,'code'=>$code];};
if($phase==='probe')$add('probe_list','lists',['staff_uuid'=>$lease['staff']['uuid']]);elseif($phase==='base'){$add('initial_list','lists',['staff_uuid'=>$lease['staff']['uuid']]);$bad=$base;unset($bad['feeding_coach']);$add('add_missing_required','add',$bad,1);$bad=$base;$bad['feeding_date']='not-a-date';$add('add_invalid_date','add',$bad,1);$bad=$base;$bad['feeding_achievement']=str_repeat('长',70);$add('add_overlong','add',$bad,1);$add('add','add',$base);}
elseif($phase==='retry-add')$add('add_retry','add',$base);
elseif($phase==='crud'){$check($row!==null,'Own source absent');$add('info_created','info',['uuid'=>$row['uuid']]);$add('list_created','lists',['staff_uuid'=>$lease['staff']['uuid']]);$add('update','update',$updated);$add('info_updated','info',['uuid'=>$row['uuid']]);$add('update_repeat','update',$updated);$bad=$updated;unset($bad['feeding_coach']);$add('update_missing_required','update',$bad,1);$bad=$updated;$bad['feeding_date']='not-a-date';$add('update_invalid_date','update',$bad,1);$bad=$updated;$bad['feeding_achievement']=str_repeat('长',70);$add('update_overlong','update',$bad,1);$add('info_after_rejections','info',['uuid'=>$row['uuid']]);$add('info_missing','info',[],1);$add('list_missing','lists',[],1);}
elseif($phase==='read'){$check($row!==null,'Own source absent');$add('info_final','info',['uuid'=>$row['uuid']]);$add('list_final','lists',['staff_uuid'=>$lease['staff']['uuid']]);}
elseif($phase==='cleanup'){$check($row!==null,'Own source absent');$add('delete','delete',['uuid'=>$row['uuid']]);$add('info_deleted','info',['uuid'=>$row['uuid']],0);$add('list_deleted','lists',['staff_uuid'=>$lease['staff']['uuid']]);$add('delete_repeat','delete',['uuid'=>$row['uuid']],1);}
else throw new RuntimeException('Unknown phase');
require_once $root.'/application/base/Security.php';$a=$lease['actor'];$token=\app\base\Security::encrypt(implode("\t",[(string)$a['id'],(string)$a['uuid'],'CDXFHADMIN','0','','','CDXFHADMIN']));$items=[];foreach($spec as $i=>$s){$test=["pm.test('HTTP200',()=>pm.response.to.have.status(200));","const b=pm.response.json();","pm.test('business code',()=>pm.expect(b.code).to.eql(".$s['code']."));"];if($s['action']==='info'&&$s['code']===0&&$s['label']!==$module.'.info_deleted'){$test[]="pm.test('full detail object',()=>pm.expect(b.data).to.be.an('object'));";$test[]="pm.test('MySQL seconds API create_time',()=>pm.expect(b.data.create_time).to.match(/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$/));";foreach($base as $key=>$value)if(in_array($key,['date','publish_date','feeding_date'],true))$test[]="pm.test('date only $key',()=>pm.expect(b.data.$key).to.match(/^\\d{4}-\\d{2}-\\d{2}$/));";}if($s['action']==='lists'&&$s['code']===0)$test[]="pm.test('each projected create_time uses seconds',()=>Object.values(b.data).filter(Array.isArray).flat().forEach(r=>{if(r.create_time!==undefined)pm.expect(r.create_time).to.match(/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$/)}));";
 $items[]=['id'=>$module.'-'.$phase.'-'.$i,'name'=>$s['label'],'type'=>'http','metaInfo'=>['type'=>'HTTP'],'request'=>['method'=>'POST','header'=>[['key'=>'X-CDX-Case','value'=>$s['label']],['key'=>'X-CDX-Phase','value'=>$phase],['key'=>'token','value'=>$token],['key'=>'Content-Type','value'=>'application/x-www-form-urlencoded']],'url'=>'http://127.0.0.1:'.($lane==='B'?18321:18322).'/p/'.$module.'/'.$s['action'],'body'=>['mode'=>'urlencoded','urlencoded'=>array_map(static function($k,$v){return ['key'=>$k,'value'=>(string)$v,'type'=>'text'];},array_keys($s['params']),array_values($s['params']))]],'event'=>[['listen'=>'test','script'=>['type'=>'text/javascript','exec'=>$test]]]];}
$save('private-spec-'.$module.'-'.$phase.'.json',$spec);$save('private-'.$module.'-'.$phase.'.apifox-cli.json',['apifoxCli'=>'2.2.8','info'=>['name'=>'Paper Match '.$lane.' '.$module.' '.$phase],'item'=>[['name'=>'Frozen owned archive flow','item'=>$items]]]);echo json_encode(['lane'=>$lane,'module'=>$module,'phase'=>$phase,'cases'=>count($spec)]),"\n";
