from sqlalchemy import Boolean, Integer, ForeignKey, Text, DateTime
from sqlalchemy.orm import relationship, Mapped, mapped_column
from typing import Optional, TYPE_CHECKING, Any
from datetime import datetime
from src.apps.base.models.base import Base
from src.core.config import settings
from sqlalchemy.ext.hybrid import hybrid_property

if TYPE_CHECKING:
    from src.apps.payment_requests.models.payment_request import PaymentRequest

class PaymentRequestLinks(Base):
    """
    PaymentRequestLinks: ORM class for PaymentRequestLinks Entity
    """

    __tablename__ = "payment_requests_links"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True, autoincrement=True)
    link: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    token: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    is_expired: Mapped[bool] = mapped_column(Boolean, default=False)
    start_date: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
    end_date: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)

    payment_request_id: Mapped[int] = mapped_column(Integer, ForeignKey("payment_requests.id"))
    payment_request: Mapped["PaymentRequest"] = relationship("PaymentRequest", back_populates="payment_links")

    invoice_id: Mapped[int] = mapped_column(Integer, ForeignKey("invoices.id"))
    invoice: Mapped[Any] = relationship("Invoice", back_populates="payment_links")

    # TODO: Uncomment when Contract model is created
    # contract_id: Mapped[int] = mapped_column(Integer, ForeignKey("contracts.id"))
    # contract: Mapped[Any] = relationship("Contract", back_populates="payment_links")

    # TODO: Uncomment when Checkout model is created
    # checkout_id: Mapped[int] = mapped_column(Integer, ForeignKey("checkouts.id"))
    # checkout: Mapped[Any] = relationship("Checkout", back_populates="payment_links")

    @hybrid_property
    def full_url(self) -> str:
        return f"{settings.SERVER_HOST}{self.link}/{'?token=' + self.token if self.token else ''}"
