import { describe, expect, it, vi } from 'vitest';

import { exportLabelLayoutPdf } from './labelPdf';

function createDependencies() {
  const canvas = document.createElement('canvas');
  vi.spyOn(canvas, 'toDataURL').mockReturnValue('data:image/png;base64,label');
  const pdf = {
    addImage: vi.fn(),
    addPage: vi.fn(),
    save: vi.fn(),
  };
  return {
    canvas,
    dependencies: {
      createCanvas: vi.fn().mockResolvedValue(canvas),
      createPdf: vi.fn().mockReturnValue(pdf),
    },
    pdf,
  };
}

describe('exportLabelLayoutPdf', () => {
  it('exports every label sheet as one landscape A4 page in source order', async () => {
    const { dependencies, pdf } = createDependencies();
    await exportLabelLayoutPdf(
      {
        fileName: '标签打印',
        html: '<div><section class="jnpf-label-sheet">第一页</section><section class="jnpf-label-sheet">第二页</section></div>',
        paperHeight: 210,
        paperWidth: 297,
      },
      dependencies,
    );

    expect(dependencies.createPdf).toHaveBeenCalledWith({ format: [297, 210], orientation: 'landscape', unit: 'mm' });
    expect(dependencies.createCanvas.mock.calls.map(([sheet]) => sheet.textContent)).toEqual(['第一页', '第二页']);
    expect(pdf.addPage).toHaveBeenCalledOnce();
    expect(pdf.addPage).toHaveBeenCalledWith([297, 210], 'landscape');
    expect(pdf.addImage).toHaveBeenCalledTimes(2);
    expect(pdf.addImage).toHaveBeenLastCalledWith('data:image/png;base64,label', 'PNG', 0, 0, 297, 210, undefined, 'FAST');
    expect(pdf.save).toHaveBeenCalledWith('标签打印.pdf');
    expect(document.querySelector('[aria-hidden="true"]')).toBeNull();
  });

  it('rejects invalid content and removes the temporary DOM after a render failure', async () => {
    const { dependencies } = createDependencies();
    await expect(exportLabelLayoutPdf({ fileName: 'empty', html: '<div></div>', paperHeight: 210, paperWidth: 297 }, dependencies)).rejects.toThrow(
      '未找到可导出的标签页面',
    );
    expect(document.querySelector('[aria-hidden="true"]')).toBeNull();

    dependencies.createCanvas.mockRejectedValueOnce(new Error('capture failed'));
    await expect(
      exportLabelLayoutPdf({ fileName: 'failed', html: '<section class="jnpf-label-sheet"></section>', paperHeight: 210, paperWidth: 297 }, dependencies),
    ).rejects.toThrow('capture failed');
    expect(document.querySelector('[aria-hidden="true"]')).toBeNull();
  });
});
