import enum
from sqlalchemy import Enum
from sqlalchemy.orm import Mapped, mapped_column, relationship,Session
from sqlalchemy import INTEGER, ForeignKey
from app.models.main import Base
from pydantic import BaseModel, Field

from app.utils.schemas_utils import CustomModel

class CategoryEnum(str, enum.Enum):
    ACCESSORIES = "ACCESSORIES"
    ARTIFICIAL_JEWELLERY = "ARTIFICIAL JEWELLERY"
    BOOKS = "BOOKS"
    BOOK = "BOOKS"
    CDIT = "CDIT"
    COFFEE_SHOP = "COFFEE SHOP"
    DEPARTMENTAL_STORE = "DEPARTMENTAL STORE"
    EYEWEAR = "EYEWEAR"
    FASHION_WEAR_WESTERN = "FASHION WEAR-WESTERN"
    FASHION_WOMENS_WEAR_ETHNIC = "FASION-WOMEN'S WEAR-ETHNIC"
    FOOTWEAR = "FOOTWEAR"
    GOURMET_FOOD = "GOURMET FOOD"
    HEALTH_BEAUTY = "HEALTH & BEAUTY"
    HOME = "HOME"
    HYPERMARKET = "HYPERMARKET"
    INDIAN_SWEETS = "INDIAN SWEETS"
    JEWELLERY_PRECIOUS = "JEWELLERY(PRECIOUS)"
    MENS_INNERWEAR = "MEN'S INNERWEAR"
    MENS_ETHNIC_WEAR = "MENS ETHNIC WEAR"
    MOBILE_STORE = "MOBILE STORE"
    MULTIBRAND_WATCH_OUTLET = "MULTIBRAND WATCH OUTLET"
    PHARMACY = "PHARMACY"
    QSR_FAST_FOOD = "QSR-FAST FOOD( NON PIZZA )"
    QSR_INDIAN_FOOD = "QSR-INDIAN FOOD"
    SPECIALITY_FABRIC_STORE = "SPECIALITY FABRIC STORE"
    SUPERMARKET = "SUPERMARKET"
    TRAVEL_GEAR = "TRAVEL GEAR"

class CategoryBase(BaseModel):
    category_id: int
    group_id: int
    choose_category: CategoryEnum

class CategoryCreate(CustomModel):
    group_id: int
    choose_category: CategoryEnum = Field(alias="chooseCategory")

class TblCategory(Base):
    __tablename__ = "tbl_category"

    category_id: Mapped[int] = mapped_column(INTEGER, primary_key=True, autoincrement=True)
    group_id: Mapped[int] = mapped_column(INTEGER, ForeignKey("tbl_group.group_id"), nullable=False)
    choose_category: Mapped[CategoryEnum] = mapped_column(Enum(CategoryEnum), nullable=False)

    group = relationship("TblGroup", back_populates="categories")
    

    @classmethod
    def create(cls, data: CategoryCreate, db: Session) -> "TblCategory":
        new_category = cls(**data.model_dump())
        db.add(new_category)
        db.flush()
        return new_category



