import { beforeEach, describe, expect, it, vi } from 'vitest';
import { Podmiot2, Podmiot2K } from '../../types/fa1.types';
import { generatePodmiot2Podmiot2K } from './Podmiot2Podmiot2k';
import { Content } from 'pdfmake/interfaces';

vi.mock('../../../shared/PDF-functions', () => ({
  createHeader: vi.fn((label) => [{ text: `HEADER:${label}` }]),
  createLabelText: vi.fn((label, value) => ({
    text: `LABEL:${label}${value && value._text ? value._text : ''}`,
  })),
  createSubHeader: vi.fn((label) => ({ text: `SUBHEADER:${label}` })),
  verticalSpacing: vi.fn((num) => ({ text: `SPACING:${num}` })),
  getTable: vi.fn((arr) => arr || []),
  getValue: vi.fn((val) => (val && val._text ? val._text : '')),
  hasValue: vi.fn((val) => Boolean(val && val._text)),
  generateColumns: vi.fn((left, right) => ({ columns: [left, right] })),
  generateLine: vi.fn((): Content[] => [{ line: true } as any]),
}));
vi.mock('./PodmiotAdres', () => ({
  generatePodmiotAdres: vi.fn((adres, label) => ({ adr: label })),
}));
vi.mock('./PodmiotDaneIdentyfikacyjne', () => ({
  generateDaneIdentyfikacyjne: vi.fn(() => [{ id: 'ID' }]),
}));
vi.mock('./PodmiotDaneKontaktowe', () => ({
  generateDaneKontaktowe: vi.fn(() => ({ contact: 'KONTAKT' })),
}));

describe('generatePodmiot2Podmiot2K', () => {
  beforeEach(() => vi.clearAllMocks());

  function hasColumns(r: unknown): r is { columns: unknown[] } {
    return (
      typeof r === 'object' &&
      r !== null &&
      'columns' in r &&
      Array.isArray((r as { columns: unknown[] }).columns)
    );
  }

  it('renders new line and at least one columns object', () => {
    const podmiot2: Podmiot2 = { NrEORI: { _text: 'A' } };
    const podmiot2K: Podmiot2K = {};
    const result: Content[] = generatePodmiot2Podmiot2K(podmiot2, podmiot2K);

    expect(result[0]).toEqual([{
      "line": true,
    }]);
    expect(
      result.some((r: Content) => {
        if (hasColumns(r)) {
          return Array.isArray(r.columns);
        }

        return false;
      })
    ).toBeTruthy();
  });

  it('builds firstColumn with full data', () => {
    const podmiot2: Podmiot2 = {
      NrEORI: { _text: 'EORI-X' },
      DaneIdentyfikacyjne: { NrID: { _text: 'FOO' } },
      Email: { _text: 'xx@a.pl' },
      NrKlienta: { _text: 'CUSTX' },
      Telefon: [{ _text: '600100200' }],
    };
    const podmiot2K: Podmiot2K = {};
    const result: any = generatePodmiot2Podmiot2K(podmiot2, podmiot2K);
    const firstCol: Content = result.find(hasColumns)?.columns[0];

    expect(firstCol).toEqual(
      expect.arrayContaining([
        { text: 'SUBHEADER:Dane identyfikacyjne' },
        { text: 'LABEL:Numer EORI: EORI-X' },
        { id: 'ID' },
        { contact: 'KONTAKT' },
        { text: 'LABEL:Numer klienta: CUSTX' },
      ])
    );
  });

  it('renders "corrected content" for both cols', () => {
    const podmiot2: Podmiot2 = {
      PrefiksNabywcy: { _text: 'PN2' },
      DaneIdentyfikacyjne: { BrakID: { _text: '1' }, NrID: { _text: '123' } },
      Adres: { AdresPol: { Miasto: { _text: 'CITY' } } },
    };
    const podmiot2K: Podmiot2K = {
      PrefiksNabywcy: { _text: 'NNK' },
      DaneIdentyfikacyjne: { NrID: { _text: 'XYZ' } },
      Adres: { AdresZagr: { Kraj: { _text: 'UK' } } },
    };
    const result: any = generatePodmiot2Podmiot2K(podmiot2, podmiot2K);
    const cols: Content[] = result.find(hasColumns)?.columns;

    expect(cols[1]).toEqual([]);
  });

  it('ends with verticalSpacing', () => {
    const podmiot2: Podmiot2 = { NrEORI: { _text: 'END' } };
    const podmiot2K: Podmiot2K = {};
    const result: Content[] = generatePodmiot2Podmiot2K(podmiot2, podmiot2K);

    expect(result[result.length - 1]).toEqual({ text: 'SPACING:1' });
  });
});
