import { describe, expect, it } from 'vitest';
import { createLatexImageInsertion } from '../image-insertion';
import { applySourceTextEdit } from '../text-edit';

describe('createLatexImageInsertion', () => {
  it('creates a figure at an ordinary cursor', () => {
    const source = 'Before\n\nAfter';
    const insertion = createLatexImageInsertion({
      source,
      cursor: 8,
      projectPath: 'figures/system-architecture.png',
    });

    expect(insertion.kind).toBe('figure');
    const result = applySourceTextEdit(source, insertion.edit);
    expect(result).toContain('\\begin{figure}[htbp]');
    expect(result).toContain(
      '\\includegraphics[width=0.80\\linewidth]{figures/system-architecture.png}',
    );
    expect(result).toContain('\\label{fig:system-architecture}');
    expect(result).toContain('\\end{figure}\n\nAfter');
  });

  it('does not nest a second figure environment', () => {
    const source = '\\begin{figure}\n  \\centering\n  \n\\end{figure}';
    const cursor = source.indexOf('  \n') + 2;
    const insertion = createLatexImageInsertion({
      source,
      cursor,
      projectPath: 'figures/result.pdf',
    });

    expect(insertion.kind).toBe('inside-figure');
    expect(insertion.edit.text).toContain('\\includegraphics');
    expect(insertion.edit.text).not.toContain('\\begin{figure}');
  });

  it('uses inline graphics inside a minipage instead of a floating figure', () => {
    const source = '\\begin{minipage}{0.5\\linewidth}\nHere\n\\end{minipage}';
    const cursor = source.indexOf('Here');
    const insertion = createLatexImageInsertion({
      source,
      cursor,
      projectPath: 'figures/result.pdf',
    });

    expect(insertion.kind).toBe('inside-figure');
    expect(insertion.edit.text).toContain('\\includegraphics');
    expect(insertion.edit.text).not.toContain('\\begin{figure}');
  });

  it('moves a figure insertion after a surrounding math environment', () => {
    const source = '\\begin{equation}\nE=mc^2\n\\end{equation}\nNext';
    const cursor = source.indexOf('E=mc^2') + 3;
    const insertion = createLatexImageInsertion({
      source,
      cursor,
      projectPath: 'figures/einstein.svg',
    });

    expect(insertion.kind).toBe('after-blocked-environment');
    expect(insertion.edit.from).toBe(source.indexOf('\\end{equation}') + 14);
  });

  it('moves a figure before an unterminated blocked environment', () => {
    const source = 'Before\n\\begin{equation}\nE=mc^2';
    const cursor = source.length;
    const insertion = createLatexImageInsertion({
      source,
      cursor,
      projectPath: 'figures/einstein.svg',
    });

    expect(insertion.kind).toBe('before-blocked-environment');
    expect(insertion.edit.from).toBe(source.indexOf('\\begin{equation}'));
    const result = applySourceTextEdit(source, insertion.edit);
    expect(result.indexOf('\\begin{figure}')).toBeLessThan(
      result.indexOf('\\begin{equation}'),
    );
  });

  it('does not nest a figure inside a table environment', () => {
    const source = '\\begin{table}\ncontent\n\\end{table}\nNext';
    const cursor = source.indexOf('content');
    const insertion = createLatexImageInsertion({
      source,
      cursor,
      projectPath: 'figures/table-result.png',
    });

    expect(insertion.kind).toBe('after-blocked-environment');
    expect(insertion.edit.from).toBe(source.indexOf('\\end{table}') + 11);
  });
});
