from sqlalchemy import Integer, DateTime, ForeignKey, String, Float
from sqlalchemy.orm import relationship, Mapped, mapped_column
from src.apps.base.models.base import Base
from src.apps.payment_requests.enums import SplitPaymentTypes
from sqlalchemy.ext.hybrid import hybrid_property
from typing import Optional
from datetime import datetime


class SplitPaymentRequests(Base):
    """
    Split Payment Request Model: ORM class for Split Payment Request Entity
    """

    __tablename__ = "split_payment_requests"

    id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True, autoincrement=True)
    sequence: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
    split_type: Mapped[str] = mapped_column(String(50), default=SplitPaymentTypes.AMOUNT)
    split_value: Mapped[float] = mapped_column(Float, default=0.0)
    billing_date: Mapped[Optional[datetime]] = mapped_column(DateTime, 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")

    @hybrid_property
    def due_amount(self) -> float:
        try:
            amount: float = 0.0
            if self.split_type == SplitPaymentTypes.PERCENTAGE:
                total_amount = self.payment_request.amount
                amount = (self.split_value / 100) * total_amount
            elif self.split_type == SplitPaymentTypes.AMOUNT:
                amount = self.split_value
            # return (amount / 100)
            return amount
        except Exception as e:
            # print('SPLIT AMOUNT ERROR  == ', e)
            return 0
