from sqlalchemy import Column, String, Numeric, Integer, DateTime, Date, ForeignKey
from sqlalchemy.orm import relationship
from utils.utils import Base
from datetime import datetime
import uuid


class Loancalculation(Base):
    __tablename__ = "loan_calculations"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    principal = Column(Numeric(12, 2), nullable=False)
    annual_interest_rate = Column(Numeric(5, 2), nullable=False)
    loan_term_months = Column(Integer, nullable=False)
    monthly_payment = Column(Numeric(12, 2), nullable=False)
    total_interest = Column(Numeric(12, 2), nullable=False)
    total_amount = Column(Numeric(12, 2), nullable=False)
    calculation_method = Column(String(50), nullable=False)
    session_id = Column(String(36), ForeignKey("calculation_sessions.id", ondelete="SET NULL"), nullable=True, index=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    amortization_schedule_entries = relationship("Amortizationscheduleentry", back_populates="loan_calculation", cascade="all, delete-orphan", passive_deletes=True)
    session = relationship("Calculationsession", back_populates="loan_calculations")


class Amortizationscheduleentry(Base):
    __tablename__ = "amortization_schedule_entries"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    loan_calculation_id = Column(String(36), ForeignKey("loan_calculations.id", ondelete="CASCADE"), nullable=False, index=True)
    payment_number = Column(Integer, nullable=False)
    payment_date = Column(Date, nullable=True)
    beginning_balance = Column(Numeric(12, 2), nullable=False)
    payment_amount = Column(Numeric(12, 2), nullable=False)
    principal_portion = Column(Numeric(12, 2), nullable=False)
    interest_portion = Column(Numeric(12, 2), nullable=False)
    ending_balance = Column(Numeric(12, 2), nullable=False)
    cumulative_interest = Column(Numeric(12, 2), nullable=False)
    cumulative_principal = Column(Numeric(12, 2), nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    loan_calculation = relationship("Loancalculation", back_populates="amortization_schedule_entries")