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

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

function makeTwoPagePdf(): Buffer {
  const stream1 = `BT /F1 12 Tf 50 740 Td (${pdfText('Abstract Robust local evidence for Paper Memory.')}) Tj ET`;
  const stream2 = `BT /F1 12 Tf 50 740 Td (${pdfText('Results Distribution shift remains stable in the local experiment.')}) Tj ET`;
  const objects = [
    '<< /Type /Catalog /Pages 2 0 R >>',
    '<< /Type /Pages /Kids [3 0 R 4 0 R] /Count 2 >>',
    '<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Resources << /Font << /F1 7 0 R >> >> /Contents 5 0 R >>',
    '<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Resources << /Font << /F1 7 0 R >> >> /Contents 6 0 R >>',
    `<< /Length ${Buffer.byteLength(stream1)} >>\nstream\n${stream1}\nendstream`,
    `<< /Length ${Buffer.byteLength(stream2)} >>\nstream\n${stream2}\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}\n`;
  source += '0000000000 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 PM3 persists a local PDF library and page-provenant scientific chunks without model/network activity', async ({ page }) => {
  const workspaceName = `paper-memory-pm3-${Date.now()}`;
  const externalModelRequests: string[] = [];
  page.on('request', (request) => {
    if (/huggingface\.co|cdn\.jsdelivr\.net|api\.openai\.com|anthropic\.com|generativelanguage/u.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();
  const overlay = page.getByTestId('interactive-ai-overlay');
  await overlay.getByRole('tab', { name: 'Papers' }).click();

  const panel = page.getByTestId('interactive-paper-memory');
  await expect(panel).toContainText('Upload papers to ask questions about your research library.');
  await expect(panel.getByRole('button', { name: 'Add papers' })).toBeVisible();
  expect(externalModelRequests).toEqual([]);

  const pdf = makeTwoPagePdf();
  await page.getByLabel('Add research PDFs to Papers').setInputFiles({
    name: 'local-research.pdf',
    mimeType: 'application/pdf',
    buffer: pdf,
  });

  await panel.getByRole('button', { name: 'Open paper library' }).click();
  await expect(panel).toContainText('local-research.pdf');
  await expect(panel).toContainText('2 pages', { timeout: 20_000 });
  await expect(panel).toContainText('Ready', { timeout: 20_000 });
  await panel.getByRole('button', { name: 'Manage library' }).click();
  await expect(panel).toContainText('Passages');
  await panel.getByRole('button', { name: 'Close paper library' }).click();
  expect(externalModelRequests).toEqual([]);

  await page.getByLabel('Add research PDFs to Papers').setInputFiles({
    name: 'duplicate.pdf',
    mimeType: 'application/pdf',
    buffer: pdf,
  });
  await expect(page.getByText(/This paper is already in Papers/)).toBeVisible();
  await expect(panel).toContainText('1 paper');

  await page.reload({ waitUntil: 'networkidle' });
  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 reopened = page.getByTestId('interactive-paper-memory');
  await reopened.getByRole('button', { name: 'Open paper library' }).click();
  await expect(reopened).toContainText('local-research.pdf');
  await expect(reopened).toContainText('2 pages');
  await expect(reopened).toContainText('Ready');
  expect(externalModelRequests).toEqual([]);
});
