from typing import Optional
from datetime import datetime
from uuid import UUID
from sqlalchemy import String, DateTime, Numeric, ForeignKey
from sqlalchemy.dialects.postgresql import UUID as PG_UUID
from sqlalchemy.orm import Mapped, mapped_column, relationship
from src.database.base import BaseModel


class Subscription(BaseModel):
    __tablename__ = "subscriptions"

    account_id: Mapped[UUID] = mapped_column(
        PG_UUID(as_uuid=True),
        ForeignKey("accounts.id", ondelete="CASCADE"),
        nullable=False,
        index=True,
    )
    plan: Mapped[str] = mapped_column(String(50), nullable=False)
    status: Mapped[str] = mapped_column(String(50), nullable=False, default="active")
    amount_cad: Mapped[Optional[float]] = mapped_column(Numeric(10, 2), nullable=True)
    billing_cycle: Mapped[Optional[str]] = mapped_column(String(20), nullable=True, default="monthly")
    current_period_start: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
    current_period_end: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
    stripe_subscription_id: Mapped[Optional[str]] = mapped_column(String(255), nullable=True, unique=True)
    payment_method_last4: Mapped[Optional[str]] = mapped_column(String(4), nullable=True)

    # Relationship
    account: Mapped[object] = relationship("Account", back_populates="subscriptions")
