from sqlalchemy import String, Integer, ForeignKey, Text, Float, DateTime
from sqlalchemy.orm import relationship, Mapped, mapped_column
from src.apps.base.models.base import Base
from src.core.config import settings
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.sql import func
from typing import Optional
from datetime import datetime


class PartialPaymentRequestsConfigs(Base):
    """
    PartialPaymentRequestsConfigs: ORM class for PartialPaymentRequestsConfigs Entity
    """

    __tablename__ = "partial_payment_requests_configs"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True, autoincrement=True)
    defined_by: Mapped[Optional[str]] = mapped_column(String(20), nullable=True)
    partial_payment_type: Mapped[Optional[str]] = mapped_column(String(20), nullable=True)
    partial_payment_value: Mapped[Optional[float]] = mapped_column(Float, nullable=True)
    due_date: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
    paid_date: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)

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

    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)
