import {readFileSync} from 'node:fs';
import { execFileSync } from 'node:child_process';
import { expect } from 'e2e';
import { test, WEB } from './t3.ts';

test('Outdated conversation controls fit a narrow PR side panel', WEB, async ({t3,app,screen,browser})=>{
 const project=await t3.project('header-demo',{'README.md':'before\n'});
 execFileSync('git',['remote','add','origin','https://github.com/example/header-demo.git'],{cwd:project});
 const thread=await t3.thread({project,title:'Review layout',messages:['Review the conversation header.']});
 await t3.open(thread);
 await screen.getByText('first fixture turn complete',{exact:false}).waitFor({state:'visible'});
 await browser.keyboard.press('Control+k');
 await screen.getByText('Link pull request to thread',{exact:true}).tap();
 await screen.getByPlaceholder('Pull request URL or #42').fill('https://github.com/example/header-demo/pull/42');
 await screen.getByRole('button','Link',{exact:true}).tap();
 await screen.getByRole('dialog','Link pull request',{exact:true}).waitFor({state:'hidden'});
 await browser.keyboard.press('Control+k');
 await screen.getByText('Show linked pull requests',{exact:true}).tap();
 await screen.getByRole('dialog','Command palette',{exact:true}).waitFor({state:'hidden'});
 await screen.getByText('example/header-demo',{exact:true}).tap();
 await screen.getByRole('button','Code',{exact:true}).tap();
 await screen.getByText('Conversations not on the current diff',{exact:true}).waitFor({state:'visible'});
 const edge=await browser.evaluate(()=>{const r=document.querySelector('[data-preview-panel-mode=inline]')!.getBoundingClientRect();return {x:r.left+1,y:400};});
 await browser.mouse.move(edge.x,edge.y);
 await browser.mouse.down();
 await browser.mouse.move(921,edge.y);
 await browser.mouse.up();
 await screen.getByText('Conversations not on the current diff',{exact:true}).tap();
 await screen.getByRole('button','Resolve',{exact:true}).waitFor({state:'visible'});
 let previous=readFileSync(await app.screenshot('settling'));
 for(let attempt=0;attempt<4;attempt++){
   await new Promise(resolve=>setTimeout(resolve,500));
   const current=readFileSync(await app.screenshot(`stable-${attempt}`));
   if(current.equals(previous)) break;
   if(attempt===3) throw new Error('Capture did not stabilize');
   previous=current;
 }
 await app.screenshot('narrow-conversation');
 const geometry=await browser.evaluate(()=>{
   const list=document.querySelector('[class~=max-h-64]')!;
   if(!list) throw new Error('No conversation list: '+[...document.querySelectorAll('button')].filter(b=>b.textContent?.trim()==='Resolve').map(b=>b.parentElement!.outerHTML.slice(0,500)).join(' | '));
   const resolve=[...list.querySelectorAll('button')].find(b=>b.textContent?.trim()==='Resolve')!;
   const card=resolve.closest('[contenteditable=false]')!;
   const button=resolve.getBoundingClientRect(),bounds=card.getBoundingClientRect();
   return {resolveInside:button.right<=bounds.right+1 && button.left>=bounds.left-1,noHorizontalOverflow:list.scrollWidth<=list.clientWidth+1};
 });
 expect(geometry.resolveInside).toBe(true);
 expect(geometry.noHorizontalOverflow).toBe(true);
});
