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

class MasterBase(BaseModel):
    master_id : int | None = Field(default=None)
    category_name : str | None = Field(default=None)
    is_deleted : int | None = Field(default=None)
    # category_id : int | None = Field(default=None)

class TblMaster(Base):
    __tablename__ = "tbl_master"
    master_id : Mapped[int] = mapped_column("master_id", Integer, primary_key=True, autoincrement=True)
    category_name : Mapped[str] = mapped_column("category_name", VARCHAR(255), nullable=True, server_default=None)
    is_deleted : Mapped[int] = mapped_column("is_deleted", Integer, default=0, server_default="0")
    # category_id : Mapped[int] = mapped_column("category_id", Integer, nullable=True, server_default=None.
    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)
    
    category_simulation = relationship("TblCategorySimulation", back_populates="master")
    
    @classmethod
    def create(cls, data:MasterBase, db:Session) ->"TblMaster":
        create_data = cls(**data.model_dump())
        db.add(create_data)
        db.flush()
        return create_data
    
    @classmethod
    def get(cls, db:Session) ->"TblMaster":
        get_data = db.query(cls).filter(cls.is_deleted == 0).all()
        return get_data
    