from sqlalchemy import (
    Boolean,
    Integer,
    ForeignKey,
    String,
    Text,
    JSON,
    DateTime,
)
from sqlalchemy.orm import relationship, Mapped, mapped_column
from sqlalchemy.sql import func
from typing import Optional, List, TYPE_CHECKING
from datetime import datetime
from src.apps.base.models.base import Base
from src.apps.payment_requests.enums import DiscountTypes

if TYPE_CHECKING:
    from typing import Any


class MerchantDiscount(Base):
    """
    MerchantDiscount Model: ORM class for MerchantDiscount Entity
    """

    __tablename__ = "merchant_discount"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True, autoincrement=True)
    title: Mapped[str] = mapped_column(String(255))
    discount_id: Mapped[Optional[str]] = mapped_column(String, nullable=True, index=True, unique=True)
    discount_value: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
    discount_type: Mapped[str] = mapped_column(String(50), default=DiscountTypes.PERCENTAGE)
    is_active: Mapped[Optional[bool]] = mapped_column(Boolean, nullable=True)

    created_by_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"))
    merchant_id: Mapped[int] = mapped_column(Integer, ForeignKey("merchants.id"))
    merchant: Mapped["Merchant"] = relationship("Merchant")

    created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
    updated_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True, onupdate=func.now())
    deleted_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
    payment_request_adjustments: Mapped[List["PaymentRequestAdjustments"]] = relationship(
        "PaymentRequestAdjustments", back_populates="merchant_discount"
    )
