from sqlalchemy import Enum as SQLAEnum
from pydantic import BaseModel, Field
from sqlalchemy import ForeignKey, String
from sqlalchemy.orm import Mapped, mapped_column, relationship, Session
from app.models.main import Base

class FurnitureEstimateBase(BaseModel):

    carpent_id:int | None = Field(default=None)
    group_id: int | None = Field(default=None)
    store_format_type : str | None = Field(default=None)
    format_type: str | None = Field(default=None)
    type_of_feature: str | None = Field(default=None)
    number_of_units: int | None = Field(default=None)
    cost_per_unit: float | None = Field(default=None)
    total : float | None = Field(default=None)
    remarks: str | None = Field(default=None)

class TblCarpentryFurniture(Base):

    __tablename__ = "tbl_carpentry_furniture"

    carpent_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    group_id: Mapped[int] = mapped_column(ForeignKey("tbl_group.group_id"), nullable=True)
    format_type: Mapped[str] = mapped_column(String(10), nullable=False)
    store_format_type: Mapped[str] = mapped_column(
    "store_format_type", 
    SQLAEnum("Store format A", "Store Format B", name="store_format_type"),
    nullable=False
)

    type_of_feature: Mapped[str] = mapped_column(String(100), nullable=False)
    number_of_units: Mapped[int] = mapped_column(nullable=False)
    cost_per_unit: Mapped[float] = mapped_column(nullable=False)
    total:Mapped[float] = mapped_column(nullable=False)
    remarks: Mapped[float] = mapped_column(nullable=False)
    
    group = relationship("TblGroup", back_populates="furniture_estimates")

    @property
    def total_cost(self) -> float:
        return self.number_of_units * self.cost_per_unit
    
    @classmethod
    def create(cls, data:FurnitureEstimateBase, db: Session) -> "TblCarpentryFurniture":
        data_dict = data.model_dump()
        new_entry = cls(**data_dict)
        db.add(new_entry)
        db.flush()
        return new_entry

 
