from sqlalchemy import Boolean, ForeignKey, Float, Text, String
from sqlalchemy.orm import relationship, Mapped, mapped_column
from typing import Optional
from src.apps.base.models.base import Base
from sqlalchemy.ext.hybrid import hybrid_property
from src.apps.payment_requests.enums import DiscountTypes


class PaymentRequestAdjustments(Base):
    """
    Payment Request Adjustments Model: ORM class for Payment Request Adjustments Entity
    """

    __tablename__ = "payment_requests_adjustments"

    id: Mapped[int] = mapped_column(primary_key=True, index=True, autoincrement=True)
    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(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(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(ForeignKey("merchant_discount.id"), default=None)
    payment_request_id: Mapped[int] = mapped_column(ForeignKey("payment_requests.id"))
    
    # Relationships
    payment_request: Mapped["PaymentRequest"] = relationship(
        back_populates="payment_request_adjustment"
    )
    merchant_discount: Mapped[Optional["MerchantDiscount"]] = relationship()
