from __future__ import annotations

from datetime import datetime
from decimal import Decimal
from typing import Optional
from uuid import UUID

from sqlalchemy import DateTime, ForeignKey, Numeric, String
from sqlalchemy.dialects.postgresql import UUID as PG_UUID
from sqlalchemy.orm import Mapped, mapped_column

from src.database.base import BaseModel


class PaymentEvent(BaseModel):
    __tablename__ = "payment_events"

    tenant_id: Mapped[UUID] = mapped_column(
        PG_UUID(as_uuid=True),
        ForeignKey("accounts.id"),
        nullable=False,
        index=True,
    )
    contract_id: Mapped[UUID] = mapped_column(
        PG_UUID(as_uuid=True),
        ForeignKey("contracts.id"),
        nullable=False,
        index=True,
    )
    invoice_id: Mapped[Optional[UUID]] = mapped_column(
        PG_UUID(as_uuid=True),
        ForeignKey("invoices.id"),
        nullable=True,
    )

    stripe_payment_intent_id: Mapped[str] = mapped_column(
        String(100), nullable=False, unique=True
    )
    stripe_charge_id: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)

    amount: Mapped[Decimal] = mapped_column(Numeric(12, 2), nullable=False)
    currency: Mapped[str] = mapped_column(
        String(3), nullable=False, default="CAD", server_default="'CAD'"
    )
    status: Mapped[str] = mapped_column(String(30), nullable=False)

    receipt_email: Mapped[Optional[str]] = mapped_column(String(255), nullable=True)
    receipt_sent_at: Mapped[Optional[datetime]] = mapped_column(
        DateTime(timezone=True), nullable=True
    )
