-- IAM-13: NEXARCH als OIDC-Provider fuer Drittanwendungen eines Mandanten.
-- Client-Registrierung und Authorization-Codes leben pro Mandant (nicht in
-- der zentralen Registry), weil ein OAuth2-Client konzeptionell zu genau
-- einem Kunden gehoert (siehe core-kanban/tickets/IAM-13.md).

CREATE TABLE oidc_clients (
    id             UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name           TEXT NOT NULL,
    client_id      TEXT NOT NULL UNIQUE,
    secret_hash    BYTEA NOT NULL,
    redirect_uris  TEXT[] NOT NULL,
    allowed_scopes TEXT[] NOT NULL,
    created_at     TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- Auth-Codes sind bewusst kurzlebig und einmal verwendbar (RFC 6749 4.1.2):
-- used_at IS NULL in der WHERE-Klausel beim Einloesen macht das Konsumieren
-- atomar, gleiches Muster wie internal/authtoken (IAM-03).
CREATE TABLE oidc_auth_codes (
    code_hash     BYTEA PRIMARY KEY,
    client_id     TEXT NOT NULL REFERENCES oidc_clients(client_id),
    user_id       UUID NOT NULL REFERENCES users(id),
    redirect_uri  TEXT NOT NULL,
    scopes        TEXT[] NOT NULL,
    created_at    TIMESTAMPTZ NOT NULL DEFAULT now(),
    expires_at    TIMESTAMPTZ NOT NULL,
    used_at       TIMESTAMPTZ
);
