import uuid
from sqlalchemy import Column, String, Text, DateTime, ForeignKey, Enum as SqlEnum, Index
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.orm import relationship
from utils.utils import Base, utc_now, EventType


class AnalyticsEvent(Base):
    __tablename__ = "analytics_events"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    event_type = Column(SqlEnum(EventType, name="eventtype_enum"), nullable=False)
    session_id = Column(String(255), nullable=False, index=True)
    calculation_id = Column(String(36), ForeignKey("calculations.id", ondelete="SET NULL"), nullable=True, index=True)
    event_data = Column(JSONB, nullable=False, default=dict)
    user_agent = Column(Text, nullable=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 = relationship("Calculation", back_populates="analytics_events")

    __table_args__ = (
        Index("ix_analytics_events_event_type", "event_type"),
        Index("ix_analytics_events_created_at", "created_at"),
    )