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


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

    __tablename__ = "invoices_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)
    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[Optional[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["Product"]] = relationship("Product", back_populates="invoice_line_items")

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

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