from sqlalchemy import (
    Integer,
    ForeignKey,
    Text,
    Float,
    DateTime,
    String,
    JSON,
)
from sqlalchemy.orm import relationship, Mapped, mapped_column
from sqlalchemy.sql import func
from typing import Optional, TYPE_CHECKING
from datetime import datetime
from src.apps.base.models.base import Base

if TYPE_CHECKING:
    from typing import Any


class MerchantTransactions(Base):
    """
    MerchantTransactions Model: ORM class for Merchant Transactions Entity
    """

    __tablename__ = "merchant_transactions"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True, autoincrement=True)
    txn_amount: Mapped[float] = mapped_column(Float, default=0.0)
    txn_type: Mapped[str] = mapped_column(String(50), nullable=False, default="Subscription")
    txn_status: Mapped[int] = mapped_column(Integer, nullable=False)
    occurred_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
    txn_id: Mapped[str] = mapped_column(String(255), unique=True)
    reference_id: Mapped[Optional[str]] = mapped_column(Text, unique=True, nullable=True)
    txn_metadata: Mapped[Optional[dict]] = mapped_column(JSON, nullable=True)
    txn_literal: Mapped[Optional[str]] = mapped_column(Text, nullable=True)

    merchant_id: Mapped[int] = mapped_column(Integer, ForeignKey("merchants.id"), nullable=False)
    merchant: Mapped["Merchant"] = relationship("Merchant")

    # TODO: Uncomment when Subscription model is created
    # subscription_id: Mapped[int] = mapped_column(Integer, ForeignKey("subscriptions.id"), nullable=False)
    # subscription: Mapped["Subscription"] = relationship("Subscription")

    payment_method_id: Mapped[Optional[int]] = mapped_column(
        Integer, ForeignKey("merchant_payment_methods.id"), nullable=True
    )
    payment_method: Mapped[Optional["MerchantPaymentMethod"]] = relationship("MerchantPaymentMethod")
