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 PM9 hardens local storage/capabilities and keeps the retrieval debugger out of production UI', async ({ page }) => {
  const workspaceName = `paper-memory-pm9-${Date.now()}`;
  const externalModelRequests: string[] = [];
  page.on('request', (request) => {
    if (/huggingface\.co|hf\.co|cdn\.jsdelivr\.net|api\.openai\.com|anthropic\.com|generativelanguage\.googleapis\.com|openrouter\.ai/iu.test(request.url())) {
      externalModelRequests.push(request.url());
    }
  });

  await createBrowserWorkspace(page, { workspaceName });
  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: 'pm9-paper.pdf',
    mimeType: 'application/pdf',
    buffer: makePdf('PM9 local browser paper uses AdamW beta_2 0.999 and learning rate 10^-4.'),
  });
  await expect(panel).toContainText('1 paper', { timeout: 20_000 });
  await panel.getByRole('button', { name: 'Open paper library' }).click();
  await panel.getByRole('button', { name: 'Manage library' }).click();
  await expect(panel).toContainText('Local indexing');
  await panel.getByRole('button', { name: 'Close paper library' }).click();

  await panel.getByLabel('Papers action').selectOption('search');
  await panel.getByLabel('Search Papers').fill('AdamW beta_2 10^-4');
  await panel.getByRole('button', { name: 'Send' }).click();
  await expect(panel.getByLabel('Papers search results')).toContainText('pm9-paper.pdf');
  await expect(panel.getByTestId('paper-memory-retrieval-debugger')).toHaveCount(0);
  expect(externalModelRequests).toEqual([]);

  await page.reload();
  await page.getByRole('button', { name: 'Open Learnitive AI' }).click();
  await page.getByTestId('interactive-ai-overlay').getByRole('tab', { name: 'Papers' }).click();
  const reopened = page.getByTestId('interactive-paper-memory');
  await expect(reopened).toContainText('1 paper', { timeout: 20_000 });
  await reopened.getByRole('button', { name: 'Open paper library' }).click();
  await expect(reopened.getByText('pm9-paper.pdf')).toBeVisible();
  expect(externalModelRequests).toEqual([]);
});
