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


class InvoiceAdjustment(Base):
    __tablename__ = "invoice_adjustments"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, index=True)
    invoice_id: Mapped[int] = mapped_column(Integer, ForeignKey("invoices.id"), nullable=False)
    is_surcharged: Mapped[bool] = mapped_column(Boolean, default=False)
    adjustment_description: Mapped[Optional[str]] = mapped_column(Text, default=None)
    disclaimer: Mapped[Optional[str]] = mapped_column(Text, default=None)
    is_discounted: Mapped[bool] = mapped_column(Boolean, default=False)
    is_manual_discount: Mapped[bool] = mapped_column(Boolean, default=False)
    discount_name: Mapped[Optional[str]] = mapped_column(String(255), nullable=True)
    discount_amount: Mapped[float] = mapped_column(Float, default=0)
    discount_type: Mapped[str] = mapped_column(String, default="amount")
    has_late_fee: Mapped[bool] = mapped_column(Boolean, default=False)
    fee_amount: Mapped[int] = mapped_column(Integer, default=0)
    late_fee_type: Mapped[str] = mapped_column(String, default="amount")
    fee_frequency: Mapped[Optional[str]] = mapped_column(String, default=None)
    late_fee_delay: Mapped[int] = mapped_column(Integer, default=0)
    late_fee_delay_frequency: Mapped[Optional[str]] = mapped_column(String, default=None)
    cap_fee_amount: Mapped[float] = mapped_column(Float, default=0)
    discount_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("merchant_discount.id"), nullable=True)
    payment_request_id: Mapped[Optional[int]] = mapped_column(
        Integer, ForeignKey("payment_requests.id"), nullable=True
    )

    merchant_discount: Mapped[Optional["MerchantDiscount"]] = relationship("MerchantDiscount")
    invoice: Mapped["Invoice"] = relationship("Invoice", back_populates="adjustment")
