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

import { applyMergedBatchPrintLayout, getMergedBatchPrintTableStyle, mergePrintDataSet } from './printData';

describe('mergePrintDataSet', () => {
  it('merges the selected data set and keeps the first record metadata', () => {
    const result = mergePrintDataSet(
      [
        { orderList: [{ id: '1', name: '记录1' }], systemInfo: { printer: '管理员' }, title: '批量清单' },
        { orderList: [{ id: '2', name: '记录2' }], systemInfo: { printer: '管理员' }, title: '忽略的标题' },
      ],
      'orderList',
    );

    expect(result).toEqual([
      {
        orderList: [
          { id: '1', name: '记录1' },
          { id: '2', name: '记录2' },
        ],
        systemInfo: { printer: '管理员' },
        title: '批量清单',
      },
    ]);
  });

  it('ignores missing, non-array and invalid data set values', () => {
    const result = mergePrintDataSet([{ orderList: [{ id: '1' }] }, null, {}, { orderList: 'invalid' }], 'orderList');

    expect(result).toEqual([{ orderList: [{ id: '1' }] }]);
  });

  it('keeps the original print records when no data set is specified', () => {
    const printDataList = [{ id: '1' }, null, { id: '2' }];

    expect(mergePrintDataSet(printDataList, '')).toEqual(printDataList);
  });

  it('does not throw when a custom script passes an invalid data set name', () => {
    const printDataList = [{ id: '1' }];

    expect(mergePrintDataSet(printDataList, null as unknown as string)).toEqual(printDataList);
  });
});

describe('applyMergedBatchPrintLayout', () => {
  it('reserves top spacing for table continuation pages', () => {
    const template = { panels: [{ paperHeader: 0 }, { paperHeader: 20 }] };

    expect(applyMergedBatchPrintLayout(template, { mergeDataSet: 'orderList' })).toEqual({
      panels: [{ paperHeader: 15 }, { paperHeader: 20 }],
    });
  });

  it('supports a custom continuation page top spacing', () => {
    const template = { panels: [{ paperHeader: 0 }] };

    expect(applyMergedBatchPrintLayout(template, { mergeDataSet: 'orderList', pageTopSpacing: 24 })).toEqual({
      panels: [{ paperHeader: 24 }],
    });
  });

  it('reserves the footer area on every page while preserving larger existing margins', () => {
    const template: any = {
      panels: [
        {
          height: 297,
          paperHeader: 30,
          paperFooter: 840,
          firstPaperFooter: 820,
          evenPaperFooter: 835,
          oddPaperFooter: 810,
          lastPaperFooter: 800,
        },
      ],
    };

    applyMergedBatchPrintLayout(template, { mergeDataSet: 'orderList' });

    const panel = template.panels[0];
    expect(panel.paperHeader).toBe(30);
    expect(panel.paperFooter).toBeCloseTo(297 * (72 / 25.4) - 15);
    expect(panel.firstPaperFooter).toBe(820);
    expect(panel.evenPaperFooter).toBeCloseTo(297 * (72 / 25.4) - 15);
    expect(panel.oddPaperFooter).toBe(810);
    expect(panel.lastPaperFooter).toBe(800);
    expect(panel.paperFooter - panel.paperHeader).toBeCloseTo(297 * (72 / 25.4) - 45);
  });

  it('supports custom bottom spacing when the template has no footer line', () => {
    const template: any = { panels: [{ height: 297, paperHeader: 0 }] };

    applyMergedBatchPrintLayout(template, { mergeDataSet: 'orderList', pageBottomSpacing: 24 });

    expect(template.panels[0].height).toBe(297);
    expect(template.panels[0].paperHeader).toBe(15);
    expect(template.panels[0].paperFooter).toBeCloseTo(297 * (72 / 25.4) - 24);
  });

  it('does not change regular print templates', () => {
    const template = { panels: [{ paperHeader: 0 }] };

    expect(applyMergedBatchPrintLayout(template, {})).toEqual({ panels: [{ paperHeader: 0 }] });
  });
});

describe('getMergedBatchPrintTableStyle', () => {
  it('creates scoped wrapping and automatic row height styles', () => {
    const style = getMergedBatchPrintTableStyle('body.merged-print');

    expect(style).toContain('body.merged-print .hiprint-printElement-tableTarget thead td');
    expect(style).toContain('body.merged-print .hiprint-printElement-tableTarget tbody td');
    expect(style).toContain('table-layout: fixed !important');
    expect(style).toContain('height: auto !important');
    expect(style).toContain('overflow-wrap: anywhere !important');
    expect(style).toContain('white-space: normal !important');
  });
});
