package de.assecutor.pdftool.invoice;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * Rechnungsdaten, die als EN16931-XML (Profil EN 16931 / "Comfort") in das
 * PDF/A-3 eingebettet werden. Ohne diese strukturierten Daten ist eine
 * ZUGFeRD-Rechnung nicht rechtskonform.
 */
public record InvoiceMetadata(
        @NotBlank String invoiceNumber,
        @NotNull LocalDate issueDate,
        LocalDate deliveryDate,
        LocalDate dueDate,
        String currency,
        String paymentTerms,
        // Käuferreferenz bzw. Leitweg-ID (BT-10) — für Rechnungen an Behörden erforderlich
        String buyerReference,
        // Zahlungsverbindung des Rechnungsstellers (BG-16, SEPA-Überweisung)
        String iban,
        String bic,
        @NotNull @Valid Party sender,
        @NotNull @Valid Party recipient,
        @NotEmpty @Valid List<LineItem> items
) {

    public record Party(
            @NotBlank String name,
            @NotBlank String street,
            @NotBlank String zip,
            @NotBlank String city,
            @NotBlank String countryCode,
            @ValidVatId String vatId,
            // Elektronische Adresse (BT-34/BT-49) — von PEPPOL-EN16931 gefordert
            @NotBlank @Email String email,
            // Telefon des Verkäufer-Kontakts (BR-DE-6); für den Empfänger optional
            String phone
    ) {
    }

    public record LineItem(
            @NotBlank String description,
            @NotNull BigDecimal quantity,
            @NotNull BigDecimal unitPriceNet,
            @NotNull BigDecimal vatPercent
    ) {
    }
}
