<?php
declare(strict_types=1);

namespace Itdatex\EInvoiceCore;

use DateTimeImmutable;

/**
 * Strukturierte Eingabe fuer den Ausgangs-Rechnungs-Builder.
 *
 * Bewusst getrennt von InvoiceData (das aus Parsing kommt) — Ausgangsrechnungen
 * brauchen vollstaendige Strukturdaten (Parties mit Adresse, Positionen,
 * Zahlungsdaten), waehrend InvoiceData fuer Eingangs-Rechnungen nur die
 * Kernfelder hat, die der Parser zuverlaessig extrahieren kann.
 */
final class InvoiceDraft
{
    /**
     * @param InvoiceLineDraft[] $lines  Mindestens eine Position erforderlich.
     */
    public function __construct(
        public readonly string $invoiceNumber,
        public readonly DateTimeImmutable $issueDate,
        public readonly InvoiceParty $seller,
        public readonly InvoiceParty $buyer,
        public readonly array $lines,
        public readonly ?DateTimeImmutable $dueDate = null,
        public readonly string $currency = 'EUR',
        public readonly ?string $buyerReference = null,
        public readonly ?string $note = null,
        public readonly ?string $paymentIban = null,
        public readonly ?string $paymentBic = null,
        public readonly ?string $paymentTerms = null,
        /** BT-72 "Actual delivery date" — BR-DE-TMP-32 verlangt diese ODER BG-14 (Period) */
        public readonly ?DateTimeImmutable $deliveryDate = null,
        /**
         * BT-3 InvoiceTypeCode nach UN/CEFACT UNTDID 1001. Default 380 =
         * Handelsrechnung. Andere gaengige Werte: 381 = Gutschrift,
         * 384 = Korrektur-/Storno-Rechnung, 389 = Selbst-Abrechnung.
         */
        public readonly int $typeCode = 380,
        /** BT-25 — Rechnungs-Nr. der Vorgaenger-Rechnung (nur bei 381/384 sinnvoll). */
        public readonly ?string $precedingInvoiceNumber = null,
        /** BT-26 — Datum der Vorgaenger-Rechnung. */
        public readonly ?DateTimeImmutable $precedingIssueDate = null,
    ) {}
}
