package de.assecutor.pdftool.invoice;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import static org.assertj.core.api.Assertions.assertThat;

class VatIdValidatorTest {

    @ParameterizedTest
    @ValueSource(strings = {
            "DE261094748",      // Assecutor Data Service GmbH
            "DE136695976",      // gültige Prüfziffer
            "de 261 094 748",   // Leerzeichen und Kleinschreibung werden normalisiert
            "ATU12345678",
            "NL123456789B01",
            "FRXX123456789"
    })
    void accepts_valid_vat_ids(String vatId) {
        assertThat(VatIdValidator.validate(vatId)).isEmpty();
    }

    @ParameterizedTest
    @ValueSource(strings = {
            "DE261094749",      // falsche Prüfziffer
            "DE12345678",       // zu kurz
            "DE1234567890",     // zu lang
            "XX123456789",      // unbekanntes Länderpräfix
            "123456789",        // Länderpräfix fehlt
            "ATU1234567",       // falsches Format für AT
            "DE"                // nur Präfix
    })
    void rejects_invalid_vat_ids(String vatId) {
        assertThat(VatIdValidator.validate(vatId)).isPresent();
    }

    @Test
    void rejects_blank_values() {
        assertThat(VatIdValidator.validate(null)).isPresent();
        assertThat(VatIdValidator.validate("  ")).isPresent();
    }

    @Test
    void normalizes_separators_and_case() {
        assertThat(VatIdValidator.normalize("de 261-094.748")).isEqualTo("DE261094748");
    }
}
