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

import { defaultPosition, defaultWatermark, validatePositionConfiguration } from '../model';

describe('watermark paper positions', () => {
  it('centers the default mark on both orientations of A4 and A3', () => {
    expect(defaultPosition('A4')).toMatchObject({
      paperWidthMm: 210,
      paperHeightMm: 297,
      portraitXMm: 65,
      portraitYMm: 138,
      landscapeXMm: 108,
      landscapeYMm: 95,
    });
    expect(defaultPosition('A3')).toMatchObject({
      paperWidthMm: 297,
      paperHeightMm: 420,
      portraitXMm: 108,
      portraitYMm: 200,
      landscapeXMm: 170,
      landscapeYMm: 138,
    });
    expect(defaultPosition('A3', 100, 30)).toMatchObject({ portraitXMm: 98, portraitYMm: 195, landscapeXMm: 160, landscapeYMm: 133 });
  });

  it('accepts centered positions on all four page variants', () => {
    const config = defaultWatermark();
    config.positions.push(defaultPosition('A3'));
    expect(validatePositionConfiguration(config)).toBeUndefined();
  });

  it('rejects duplicate paper types and coordinates that exceed a rotated mark boundary', () => {
    const config = defaultWatermark();
    config.positions.push(defaultPosition('A4'));
    expect(validatePositionConfiguration(config)).toContain('请勿重复添加');

    config.positions.pop();
    config.positions[0]!.portraitXMm = 205;
    expect(validatePositionConfiguration(config)).toContain('纵向位置会使水印超出纸张');

    config.positions[0]!.portraitXMm = 65;
    config.positions[0]!.landscapeYMm = 211;
    expect(validatePositionConfiguration(config)).toContain('横向位置的 X/Y 必须位于纸张范围内');

    config.positions[0]!.landscapeYMm = 95;
    config.rotationAngle = -30;
    config.positions[0]!.portraitYMm = 0;
    expect(validatePositionConfiguration(config)).toContain('纵向位置会使水印超出纸张');
  });

  it('allows a tiled origin without requiring the entire mark to fit at that origin', () => {
    const config = defaultWatermark();
    config.layoutMode = 'TILED';
    config.positions[0]!.portraitYMm = 290;
    expect(validatePositionConfiguration(config)).toBeUndefined();
  });
});
