from sqlalchemy import Boolean, Integer, ForeignKey, Float, Text, String
from sqlalchemy.orm import relationship, Mapped, mapped_column
from typing import Optional, TYPE_CHECKING, Any
from src.apps.base.models.base import Base

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

class PaymentRequestLineItems(Base):
    """
    Recurring Payment Request Model: ORM class for Recurring Payment Request Entity
    """

    __tablename__ = "payment_requests_line_items"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True, autoincrement=True)
    title: Mapped[str] = mapped_column(Text, default="")
    description: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    unit_price: Mapped[float] = mapped_column(Float, default=0.0)
    quantity: Mapped[int] = mapped_column(Integer, default=1)
    tax: Mapped[float] = mapped_column(Float, default=0.00)
    display_order: Mapped[int] = mapped_column(Integer, default=0)
    tax_amount: Mapped[Optional[float]] = mapped_column(Float, default=0.00, nullable=True)
    discount: Mapped[Optional[float]] = mapped_column(Float, default=0, nullable=True)
    discount_type: Mapped[Optional[str]] = mapped_column(String(20), nullable=True)
    cost: Mapped[Optional[float]] = mapped_column(Float, default=0.0, nullable=True)
    upcharge: Mapped[float] = mapped_column(Float, default=0.0, nullable=True)    

    product_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("products.id"), nullable=True)
    product: Mapped[Optional[Any]] = relationship("Product", back_populates="line_items")

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

    # TODO: Uncomment when TaxRate model is created
    # tax_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("tax_rates.id"), nullable=True)
    # taxes: Mapped[Optional[Any]] = relationship("TaxRate", back_populates="line_items")
