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 10 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');
}

function fixtures(from: number, count: number) {
  return Array.from({ length: count }, (_, offset) => {
    const index = from + offset;
    return {
      name: `scale-${String(index).padStart(2, '0')}.pdf`,
      mimeType: 'application/pdf',
      buffer: makePdf(`Scale certification paper ${index}. Unique evidence token SCALE_${index}.`),
    };
  });
}

test('R29 certifies Papers library counts at 1, 10, 30 and 50 with reload recovery and no model load on library open', async ({ page }) => {
  const workspaceName = `papers-scale-r29-${Date.now()}`;
  const modelRequests: 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())) {
      modelRequests.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');
  const input = page.getByLabel('Add research PDFs to Papers');

  await input.setInputFiles(fixtures(1, 1));
  await expect(panel).toContainText('1 paper', { timeout: 20_000 });

  await input.setInputFiles(fixtures(2, 9));
  await expect(panel).toContainText('10 papers', { timeout: 20_000 });

  await input.setInputFiles(fixtures(11, 20));
  await expect(panel).toContainText('30 papers', { timeout: 20_000 });

  await input.setInputFiles(fixtures(31, 20));
  await expect(panel).toContainText('50 papers', { timeout: 20_000 });
  expect(modelRequests).toEqual([]);

  await panel.getByRole('button', { name: 'Open paper library' }).click();
  const rendered = panel.locator('[data-paper-memory-virtual-item]');
  await expect(rendered.first()).toBeVisible();
  expect(await rendered.count()).toBeLessThan(50);
  await panel.getByRole('button', { name: 'Close paper library' }).click();

  await page.reload();
  await page.getByRole('button', { name: 'Open Learnitive AI' }).click();
  await page.getByTestId('interactive-ai-overlay').getByRole('tab', { name: 'Papers' }).click();
  await expect(page.getByTestId('interactive-paper-memory')).toContainText('50 papers', { timeout: 20_000 });
  expect(modelRequests).toEqual([]);
});
