import { expect, test } from '@playwright/test';
import { createBrowserWorkspace } from './common';

function pdfText(text: string): string {
  return text.replaceAll('\\', '\\\\').replaceAll('(', '\\(').replaceAll(')', '\\)');
}

function makePdf(text: string): Buffer {
  const stream = `BT /F1 12 Tf 50 740 Td (${pdfText(text)}) Tj ET`;
  const objects = [
    '<< /Type /Catalog /Pages 2 0 R >>',
    '<< /Type /Pages /Kids [3 0 R] /Count 1 >>',
    '<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Resources << /Font << /F1 5 0 R >> >> /Contents 4 0 R >>',
    `<< /Length ${Buffer.byteLength(stream)} >>\nstream\n${stream}\nendstream`,
    '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>',
  ];
  let source = '%PDF-1.4\n';
  const offsets: number[] = [0];
  objects.forEach((object, index) => {
    offsets.push(Buffer.byteLength(source));
    source += `${index + 1} 0 obj\n${object}\nendobj\n`;
  });
  const xref = Buffer.byteLength(source);
  source += `xref\n0 ${objects.length + 1}\n0000000000 65535 f \n`;
  for (let index = 1; index <= objects.length; index += 1) source += `${String(offsets[index]).padStart(10, '0')} 00000 n \n`;
  source += `trailer\n<< /Size ${objects.length + 1} /Root 1 0 R >>\nstartxref\n${xref}\n%%EOF\n`;
  return Buffer.from(source, 'ascii');
}

test('R14.26.3 PM6 refuses insufficient evidence without silently loading generative Gemma', async ({ page }) => {
  const workspaceName = `paper-memory-pm6-${Date.now()}`;
  const externalModelRequests: string[] = [];
  page.on('request', (request) => {
    if (/huggingface\.co|cdn\.jsdelivr\.net|litert|gemma-4/iu.test(request.url())) externalModelRequests.push(request.url());
  });

  await createBrowserWorkspace(page, { workspaceName });
  await page.getByRole('link', { name: /^main\.tex$/ }).click();
  await page.getByRole('button', { name: 'Open Learnitive AI' }).click();
  await page.getByTestId('interactive-ai-overlay').getByRole('tab', { name: 'Papers' }).click();
  const panel = page.getByTestId('interactive-paper-memory');

  await page.getByLabel('Add research PDFs to Papers').setInputFiles({
    name: 'local-paper.pdf',
    mimeType: 'application/pdf',
    buffer: makePdf('Results Robust local research uses AdamW for optimization.'),
  });
  await expect(panel).toContainText('1 paper', { timeout: 20_000 });
  expect(externalModelRequests).toEqual([]);

  await panel.getByLabel('Ask Papers').fill('quantum zebrafish metabolomics xyzzy');
  await panel.getByRole('button', { name: 'Send', exact: true }).click();
  await expect(panel.getByLabel('Papers grounded conversation')).toContainText('could not find enough relevant evidence');
  expect(externalModelRequests).toEqual([]);
});
