import { convertBbanToIban } from '../qr';

test('konverze BBAN s prefixem na IBAN', () => {
    // Číslo účtu 19-2000145399/0800 (Česká spořitelna) → CZ6508000000192000145399
    const iban = convertBbanToIban('19-2000145399/0800');
    expect(iban).toBe('CZ6508000000192000145399');
    expect(iban).toHaveLength(24);
});

test('konverze BBAN bez prefixu na IBAN', () => {
    // Číslo účtu 2000145399/0800 (bez prefixu) → prefix se doplní jako 000000
    const iban = convertBbanToIban('2000145399/0800');
    expect(iban).toBe('CZ7908000000002000145399');
    expect(iban).toHaveLength(24);
});

test('konverze BBAN s krátkým číslem účtu – zero-padding', () => {
    // Krátké číslo účtu 123456/0100 → prefix 000000, account 0000123456
    const iban = convertBbanToIban('123456/0100');
    expect(iban).toHaveLength(24);
    // bankCode(4) + prefix(6) + account(10) = 20 číslic za CZ+checkdigits
    expect(iban).toMatch(/^CZ\d{2}01000000000000123456$/);
});

test('kontrolní číslice jsou platné (mod 97)', () => {
    const iban = convertBbanToIban('19-2000145399/0800');
    // Přesuneme první 4 znaky na konec, nahradíme písmena čísly a mod 97 musí dát 1
    const rearranged = iban.slice(4) + iban.slice(0, 4);
    const numeric = rearranged.replace(/[A-Z]/g, (c) => (c.charCodeAt(0) - 55).toString());
    expect(BigInt(numeric) % BigInt(97)).toBe(BigInt(1));
});

test('výsledek vždy začíná CZ', () => {
    expect(convertBbanToIban('100-2000145399/0300')).toMatch(/^CZ/);
    expect(convertBbanToIban('2000145399/0100')).toMatch(/^CZ/);
});
