import fs from 'node:fs';import {expect,test} from '@playwright/test';import {root,type Check} from './permission-support';
const manual=JSON.parse(fs.readFileSync('qa/issues/4298/dev/manual-confirmations.json','utf8'));
const items=JSON.parse(fs.readFileSync('qa/issues/4298/dev/checklist.json','utf8')).checklist as string[];
for(const item of items)test(item,async({},info)=>{
 const id=item.split(' ')[0];const roles=id==='W04'?['BO','VE']:id==='R01'||id==='R02'?['CO']:id==='R03'?['BO']:id==='R04'||id==='C06'?['VE']:id==='C07'||id==='C08'?['CO','BO']:['CO','BO','VE'];
 const records:Check[]=roles.flatMap(role=>{const p=`${root}/matrix/${role}.json`;return fs.existsSync(p)?JSON.parse(fs.readFileSync(p,'utf8')).filter((x:Check)=>x.id===id):[];});
 await info.attach('item-result',{body:Buffer.from(JSON.stringify({id,roles,records},null,2)),contentType:'application/json'});
 for(const file of [...new Set(records.flatMap(x=>x.evidence))])if(fs.existsSync(file))await info.attach(file.split('/').at(-1)!,{path:file,contentType:file.endsWith('.jpeg')?'image/jpeg':'image/png'});
 const failures=records.filter(x=>x.status==='FAIL');expect(failures.map(x=>`${x.role}/${x.combination}: ${x.detail}`),id).toEqual([]);
 if(manual.items.includes(id)){info.annotations.push({type:'verification',description:'개인확인 완료: '+manual.confirmedBy});await info.attach('개인확인',{body:Buffer.from(JSON.stringify({...manual,item:id},null,2)),contentType:'application/json'});return;}
 const combinations:Record<string,string[]>={P02:['거래+정산','거래만','정산만','둘 다 없음'],P03:['거래+정산','거래만','정산만','둘 다 없음'],N01:['거래+정산','거래만','정산만','둘 다 없음'],N02:['거래+정산','거래만','정산만'],N05:['정산만','둘 다 없음'],N06:['거래만','둘 다 없음'],W01:['거래+정산','정산만'],W02:['정산만']};
 const missing=roles.filter(role=>!records.some(x=>x.role===role));const untested=roles.flatMap(role=>(combinations[id]??[]).filter(combination=>!records.some(x=>x.role===role&&x.combination===combination)).map(combination=>`${role}/${combination}`));const blocks=records.filter(x=>x.status==='BLOCKED');test.skip(missing.length>0||blocks.length>0||untested.length>0,`BLOCKED: ${missing.length?'미검증 역할 '+missing.join(',')+'; ':''}${untested.length?'미검증 조합 '+untested.join(',')+'; ':''}${blocks.map(x=>`${x.role}: ${x.detail}`).join('; ')}`);expect(records.length).toBeGreaterThan(0);
});
