-- 0008_payment_methods.sql
--
-- Zahlungs-Stammdaten + Zahlungs-Felder an Lieferungen.
--
-- Designentscheidung: eigene Tabelle statt Enum, damit Methoden über
-- einen API-Endpoint zur Laufzeit angelegt/deaktiviert werden können
-- (z. B. neue Anbieter wie PayPal oder Klarna). FK auf `deliveries`
-- mit `ON DELETE RESTRICT` — historische Lieferungen sollen ihren
-- Methoden-Bezug niemals verlieren. Soft-Delete ist als
-- `active`-Flag möglich; Hard-Delete bleibt für nie-genutzte Methoden.

CREATE TABLE payment_methods (
    id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    -- `code` ist der stabile Programm-Identifier (z. B. „cash"). Wird vom
    -- Aufrufer vergeben, muss eindeutig sein. App und Berichts-Code
    -- können darüber spezielle Methoden referenzieren, ohne die UUID
    -- kennen zu müssen.
    code        TEXT NOT NULL UNIQUE,
    -- Display-Name in der UI — frei änderbar via PATCH, z. B.
    -- „EC-Karte" → „Girocard".
    name        TEXT NOT NULL,
    -- Soft-Delete: deaktivierte Methoden bleiben im DB-Stamm und
    -- bleiben damit für historische Lieferungen referenzierbar.
    -- Bei neuen Lieferungen filtert die App standardmäßig auf
    -- `active = true`.
    active      BOOLEAN NOT NULL DEFAULT TRUE,
    created_at  TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

-- Initialer Stamm: die vier vom CEO definierten Methoden mit
-- deterministischen UUIDs, damit Demo-Seeds und Tests stabile Keys
-- haben.
INSERT INTO payment_methods (id, code, name) VALUES
    ('99999999-9999-9999-9999-999999999901', 'cash',        'Bar'),
    ('99999999-9999-9999-9999-999999999902', 'ec_card',     'EC-Karte'),
    ('99999999-9999-9999-9999-999999999903', 'credit_card', 'Kreditkarte'),
    ('99999999-9999-9999-9999-999999999904', 'invoice',     'Auf Rechnung (14 Tage netto)');

-- Lieferungen: Vorauszahlung + gewählte Zahlungsmethode für den Rest.
-- `prepaid_amount` ist `DOUBLE PRECISION` (≈ f64), kein NUMERIC —
-- für 2 Nachkommastellen reicht das locker und die sqlx-Default-
-- Features unterstützen es nativ ohne extra Crates.
ALTER TABLE deliveries
    ADD COLUMN prepaid_amount DOUBLE PRECISION NOT NULL DEFAULT 0
        CHECK (prepaid_amount >= 0),
    -- Default beim Migrieren auf „cash" — die häufigste Methode. Die
    -- Default-Klausel räumen wir gleich wieder ab, damit zukünftige
    -- INSERTs den FK explizit setzen müssen.
    ADD COLUMN payment_method_id UUID NOT NULL
        DEFAULT '99999999-9999-9999-9999-999999999901'
        REFERENCES payment_methods(id) ON DELETE RESTRICT;

ALTER TABLE deliveries ALTER COLUMN payment_method_id DROP DEFAULT;

-- Lookup-Index: Reports oder Filter „alle Lieferungen mit Rechnung"
-- profitieren davon. Ohne Index wäre das ein voller Tabelle-Scan.
CREATE INDEX deliveries_payment_method ON deliveries(payment_method_id);
