import {expect,type Page,type Locator,type TestInfo} from '@playwright/test';
import fs from 'node:fs';
import {getRuntimeQaEnv} from '../../../../src/qa/env';
export const env=()=>getRuntimeQaEnv('dev','admin','ADMIN');
export const privateRoot='qa-results/issues/4420/private';
export function backup(name:string,data:unknown){fs.mkdirSync(privateRoot,{recursive:true});fs.writeFileSync(`${privateRoot}/${name}.json`,JSON.stringify(data,null,2));}
export async function dismiss(page:Page){const p=page.locator('.swal2-popup:visible');if(await p.count()){const b=p.getByRole('button',{name:/확인|OK/}).first();if(await b.isVisible())await b.click();}const f=page.getByRole('dialog').filter({has:page.locator('input[name="name"],input[name="businessInfo.name"]')});if(await f.count()&&await f.first().isVisible())await f.first().getByRole('button',{name:'취소',exact:true}).click();}
export async function route(page:Page,entity='vendor-manage'){
 await dismiss(page);const e=env();const initial=entity==='vendor-manage'?page.waitForResponse(r=>r.request().method()==='GET'&&new URL(r.url()).pathname.endsWith('/v2/vendors/manage')&&r.status()===200,{timeout:30000}):Promise.resolve();await page.goto(`${e.baseUrl}/business/${entity}?tenantId=redacted}`,{waitUntil:'domcontentloaded',timeout:30000});await initial;const a=page.locator('[data-route-keep-alive-active=true]');await expect(a.getByRole('button',{name:'검색',exact:true})).toBeVisible({timeout:20000});return a;
}
export async function open(page:Page,entity:string,name:string){
 const a=await route(page,entity),label=entity==='vendor-manage'?'가맹점명':entity==='branch'?'영업점명':'법인명';
 if(entity!=='corporation')await a.getByText('상세검색',{exact:true}).click();
 const direct=a.getByText('직접 입력',{exact:true});if(await direct.count())await a.getByRole('checkbox',{name:label+' 직접 입력',exact:true}).check();
 const s=a.getByRole('textbox',{name:label,exact:true});await s.click();await s.fill(name);
 if(entity==='corporation'){await page.getByRole('button',{name:new RegExp(name)}).last().click();await s.press('Escape');}
 const found=entity==='vendor-manage'?page.waitForResponse(r=>r.request().method()==='GET'&&new URL(r.url()).pathname.endsWith('/v2/vendors/manage')&&new URL(r.url()).searchParams.get('vendorName')===name&&r.status()===200):Promise.resolve();await a.getByRole('button',{name:'검색',exact:true}).click();await found;if(entity!=='corporation')await expect(s).toHaveValue(name);
 const row=a.locator('.MuiDataGrid-row').filter({has:page.getByText(name,{exact:true})});await expect(row,'지정 데이터 이름 정확히 일치').toHaveCount(1,{timeout:15000});const id=(await row.getAttribute('data-id'))!;
 const wait=page.waitForResponse(r=>r.request().method()==='GET'&&new URL(r.url()).pathname.endsWith('/'+id));await row.locator('svg.lucide-pencil').click();const res=await wait;expect(res.status()).toBe(200);const detail=(await res.json()).payload;
 const form=page.getByRole('dialog').filter({has:page.locator('input[name="'+(entity==='vendor-manage'?'name':'businessInfo.name')+'"]')}).first();await expect(form).toBeVisible();expect(detail.businessInfo.name).toBe(name);return{form,id,detail};
}
export function field(form:Locator){return form.locator('input[name="holidayTransferEnabled"]');}
export function select(form:Locator,label='휴일 지갑 이체'){return form.getByRole('combobox',{name:new RegExp('^'+label)});}
export async function choose(page:Page,form:Locator,value:boolean,label='휴일 지갑 이체'){await select(form,label).click();await page.getByRole('option',{name:value?'사용':'미사용',exact:true}).click();await expect(field(form)).toHaveValue(String(value));}
export async function shot(form:Locator,info:TestInfo,name:string){await info.attach(name+'.png',{body:await form.locator('.modal-content').screenshot({mask:[form.locator('input:not([name="holidayTransferEnabled"]),textarea')],maskColor:'#d1d5db'}),contentType:'image/png'});}
export async function proof(info:TestInfo,data:unknown){await info.attach('verification.json',{body:JSON.stringify(data,null,2),contentType:'application/json'});}
export function profile(d:any){const x=JSON.parse(JSON.stringify(d));delete x.updatedAt;delete x.wallet;delete x.businessInfo.note;delete x.holidayTransferEnabled;return x;}
