import { describe, expect, it, vi } from 'vitest';
import { generateDaneIdentyfikacyjneTPodmiot3Dto } from './Podmiot3Podmiot2k';
import type {Content} from "pdfmake/interfaces";

vi.mock('../../../shared/PDF-functions', () => ({
  createHeader: vi.fn((text: string) => [`header:${text}`]),
  createLabelText: vi.fn((label: string, value: any) => [`label:${label}${value}`]),
  generateTwoColumns: vi.fn((col1: any, col2: any) => ({ columns: [col1, col2] })),
  getTable: vi.fn((data: any) => (data ? ['table:data'] : [])),
  hasValue: vi.fn((val: any) => val !== undefined && val !== null && val !== ''),
  generateLine: vi.fn((): Content[] => [{ line: true } as any]),
}));

vi.mock('../../../shared/generators/common/functions', () => ({
  getRolaString: vi.fn((rola: any) => `rola:${rola}`),
}));

vi.mock('./PodmiotAdres', () => ({
  generatePodmiotAdres: vi.fn((adres: any, label?: string) => [`adres:${label ?? ''}`]),
}));

vi.mock('./PodmiotDaneIdentyfikacyjneTPodmiot2Dto', () => ({
  generateDaneIdentyfikacyjneTPodmiot2Dto: vi.fn((data: any) => [`dane:${data}`]),
}));

vi.mock('./PodmiotDaneKontaktowe', () => ({
  generateDaneKontaktowe: vi.fn((data: any) => [`kontakt:${data}`]),
}));

describe(generateDaneIdentyfikacyjneTPodmiot3Dto.name, () => {
  it('should return empty array when input is undefined', () => {
    const result = generateDaneIdentyfikacyjneTPodmiot3Dto(undefined, 0);
    expect(result).toEqual([]);
  });

  it('should generate full structure with all fields', () => {
    const podmiotDto = {
      fakturaPodmiotNDto: {
        NrEORI: 'EORI123',
        Rola: 'R',
        OpisRoli: 'OpisRoli',
        Udzial: 100,
        DaneKontaktowe: [{ email: 'test@test.com' }],
        NrKlienta: 'K123',
        IDNabywcy: 'ID1',
        DaneIdentyfikacyjne: 'Dane1',
        Adres: 'Adres1',
        AdresKoresp: 'AdresKoresp1',
      },
      podmiot2KDto: {
        IDNabywcy: 'ID2',
        DaneIdentyfikacyjne: 'Dane2',
        Adres: 'Adres2',
      },
    };

    const result = generateDaneIdentyfikacyjneTPodmiot3Dto(podmiotDto as any, 0);

    expect(result[0]).toEqual([{
      "line": true,
    }]);

    expect(result.some((r: any) => r.columns)).toBe(true);
  });

  it('should handle missing optional fields gracefully', () => {
    const podmiotDto = {
      fakturaPodmiotNDto: {},
      podmiot2KDto: {},
    };

    const result = generateDaneIdentyfikacyjneTPodmiot3Dto(podmiotDto as any, 1);

    expect(result[0]).toEqual([{
      "line": true,
    }]);
  });
});
