import uuid
from sqlalchemy import Column, String, Integer, Numeric, DateTime, ForeignKey, Index, UniqueConstraint
from sqlalchemy.orm import relationship
from utils.utils import Base, utc_now


class Calculation(Base):
    __tablename__ = "calculations"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    monthly_investment = Column(Numeric(15, 2), nullable=False)
    investment_period_years = Column(Integer, nullable=False)
    expected_return_rate = Column(Numeric(5, 2), nullable=False)
    total_investment = Column(Numeric(15, 2), nullable=False)
    estimated_returns = Column(Numeric(15, 2), nullable=False)
    maturity_value = Column(Numeric(15, 2), nullable=False)
    session_id = Column(String(255), nullable=True, index=True)
    created_at = Column(DateTime(timezone=True), default=utc_now, nullable=False)
    updated_at = Column(DateTime(timezone=True), default=utc_now, onupdate=utc_now, nullable=False)

    calculation_breakdowns = relationship("Calculationbreakdown", back_populates="calculation", cascade="all, delete-orphan", passive_deletes=True)
    analytics_events = relationship("AnalyticsEvent", back_populates="calculation")


class Calculationbreakdown(Base):
    __tablename__ = "calculation_breakdowns"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    calculation_id = Column(String(36), ForeignKey("calculations.id", ondelete="CASCADE"), nullable=False, index=True)
    period = Column(Integer, nullable=False)
    invested_amount = Column(Numeric(15, 2), nullable=False)
    interest_earned = Column(Numeric(15, 2), nullable=False)
    total_value = Column(Numeric(15, 2), nullable=False)
    created_at = Column(DateTime(timezone=True), default=utc_now, nullable=False)
    updated_at = Column(DateTime(timezone=True), default=utc_now, onupdate=utc_now, nullable=False)

    calculation = relationship("Calculation", back_populates="calculation_breakdowns")

    __table_args__ = (
        Index("ix_calculation_breakdowns_calculation_period", "calculation_id", "period"),
    )