from datetime import datetime
from pydantic import BaseModel, Field
from sqlalchemy.orm import Mapped, mapped_column, relationship, Session
from sqlalchemy import DateTime, Integer,  ForeignKey, func
from app.models.base_class import Base

class UserSimulationBase(BaseModel):
    user_sim_id : int | None = Field(default=None)
    user_id : int | None = Field(default=None)
    simulation_id : int | None = Field(default=None)

class TblUserSimulation(Base):
    __tablename__ = "tbl_user_simulation"
    user_sim_id : Mapped[int] = mapped_column("user_sim_id", Integer, primary_key=True, autoincrement=True)
    user_id : Mapped[int] = mapped_column("user_id", ForeignKey("tbl_user.user_id"))
    simulation_id : Mapped[int] = mapped_column("simulation_id", ForeignKey("tbl_simulation.simulation_id"))
    created_at : Mapped[datetime] = mapped_column("created_at", DateTime(timezone=True), server_default=func.now(), nullable=False)
    updated_at : Mapped[datetime] = mapped_column("updated_at", DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False)
    
    simulation = relationship("TblSimulation", back_populates="user_sim_simulation")
    user = relationship("TblUser", back_populates="user_sim_user")
    
    @classmethod
    def create(cls, data:UserSimulationBase, db:Session) ->"TblUserSimulation":
        create_data = cls(**data.model_dump())
        db.add(create_data)
        db.flush()
        return create_data
    
    