from pydantic import BaseModel, Field
from sqlalchemy.orm import Mapped, mapped_column, relationship, Session
from sqlalchemy import Enum, Integer, VARCHAR, ForeignKey, Text
from app.models.base_class import Base
from sqlalchemy import Enum as SqlEnum
from enum import Enum 

class PromotionCalenderBase(BaseModel):
    promotion_id : int | None = Field(default=None)
    select_category : str | None = Field(default=None)
    type_of_promotion : str | None = Field(default=None)
    success_metric : str | None = Field(default=None)
    objective : str | None = Field(default=None)
    remarks : str | None = Field(default=None)
    # date : int | None = Field(default=None)
    month : str | None = Field(default=None)
    # year : int | None = Field(default=None)
    # day : str | None = Field(default=None)
    group_id : int | None = Field(default=None)
    
# class DayEnum(str, Enum):
#     MONDAY = "Monday"
#     TUESDAY = "Tuesday"
#     WEDNESDAY = "Wednesday"
#     THURSDAY = "Thursday"
#     FRIDAY = "Friday"
#     SATURDAY = "Saturday"
#     SUNDAY = "Sunday"


class MonthEnum(str, Enum):
    JANUARY = "January"
    FEBRUARY = "February"
    MARCH = "March"
    APRIL = "April"
    MAY = "May"
    JUNE = "June"
    JULY = "July"
    AUGUST = "August"
    SEPTEMBER = "September"
    OCTOBER = "October"
    NOVEMBER = "November"
    DECEMBER = "December"

class TblPromotionCalender(Base):
    __tablename__ = "tbl_promotion_calender"
    promotion_id : Mapped[int] = mapped_column("promotion_id", Integer, primary_key=True, autoincrement=True)
    select_category : Mapped[str] = mapped_column("select_category", Text, nullable=True, server_default=None)
    type_of_promotion : Mapped[str] = mapped_column("type_of_promotion",Text, nullable=True, server_default=None)
    success_metric : Mapped[str] = mapped_column("success_metric",Text, nullable=True, server_default=None)
    objective : Mapped[str] = mapped_column("objective",Text, nullable=True, server_default=None)
    remarks : Mapped[str] = mapped_column("remarks",Text, nullable=True, server_default=None)
    # date : Mapped[int] = mapped_column("date", Integer, nullable=True, server_default=None)
    month : Mapped[str] = mapped_column("month",SqlEnum(MonthEnum, name="month_enum"), nullable=False, server_default=None)
    # year : Mapped[int] = mapped_column("year", Integer, nullable=True, server_default=None)
    # day : Mapped[str] = mapped_column("day", SqlEnum(DayEnum, name="day_enum"), nullable=True, server_default=None)
    group_id : Mapped[int] = mapped_column("group_id", ForeignKey("tbl_group.group_id"))
    
    @classmethod
    def create(cls, data: PromotionCalenderBase, db: Session) ->"TblPromotionCalender":
        data_dict = data.model_dump()
        new_data = cls(**data_dict)
        db.add(new_data)
        db.flush()
        return new_data
    
    @classmethod
    def get(cls, group_id: int, db: Session) ->"TblPromotionCalender":
        get_data = db.query(cls).filter(cls.group_id == group_id).all()
        return get_data
    
    @classmethod
    def update(cls, promotion_id: int, data: PromotionCalenderBase, db: Session) ->"TblPromotionCalender":
        update_data = db.query(cls).filter(cls.promotion_id == promotion_id).first()
        data_dict = data.model_dump()
        for key, value in data_dict.items():
            if value is not None:
                setattr(update_data, key, value)
        db.commit()
        db.refresh(update_data)
        
    @classmethod
    def delete(cls, promotion_id:int, db:Session) ->"TblPromotionCalender":
        delete_data = db.query(cls).filter(cls.promotion_id == promotion_id).first()
        if not delete_data:
            return False
        db.delete(delete_data)
        db.commit()
        return delete_data