from sqlalchemy import ForeignKey, Boolean, DateTime, Integer, String
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship, Mapped, mapped_column
from src.apps.base.models.base import Base


class PaymentRequestApproval(Base):
    """
    Merchant Note Model: ORM class for Merchant Note Entity
    """

    __tablename__ = "payment_requests_approvals"

    id: Mapped[int] = mapped_column(primary_key=True, index=True, autoincrement=True)

    # TODO: Uncomment when Contract model is created
    # contract_id: Mapped[int | None] = mapped_column(ForeignKey("contracts.id"), nullable=True)
    # contract: Mapped["Contract"] = relationship("Contract", back_populates="contract_approvals")

    payment_request_id: Mapped[int | None] = mapped_column(
        ForeignKey("payment_requests.id"), nullable=True
    )
    payment_request: Mapped["PaymentRequest"] = relationship(
        "PaymentRequest", back_populates="payment_request_approvals"
    )

    merchant_id: Mapped[int | None] = mapped_column(ForeignKey("merchants.id"), nullable=True)
    merchant: Mapped["Merchant"] = relationship("Merchant", foreign_keys=[merchant_id], uselist=False)

    merchant_signer_id: Mapped[int | None] = mapped_column(
        ForeignKey("users.id"), nullable=True
    )
    merchant_signer: Mapped["User"] = relationship(
        "User", foreign_keys=[merchant_signer_id], uselist=False
    )

    is_approved: Mapped[bool | None] = mapped_column(Boolean, default=None)

    approved_at: Mapped[DateTime | None] = mapped_column(DateTime, nullable=True)

    created_at: Mapped[DateTime] = mapped_column(DateTime, server_default=func.now())
