import enum
from datetime import datetime
from typing import Optional, List

from sqlalchemy import String, Text, ForeignKey, Enum, DateTime, Integer
from sqlalchemy.orm import Mapped, mapped_column, relationship

from src.database import Base


class CategoryStatus(enum.Enum):
    DISABLED = 0
    ENABLED = 1

class Category(Base):
    __tablename__ = "category"

    category_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    name: Mapped[str] = mapped_column(String(255), nullable=False)
    description: Mapped[Optional[str]] = mapped_column(Text, nullable=True)

    parent_category_id: Mapped[Optional[int]] = mapped_column(ForeignKey("category.category_id"), nullable=True)
    parent: Mapped[Optional["Category"]] = relationship(
        back_populates="children",
        remote_side=[category_id]
    )
    children: Mapped[List["Category"]] = relationship(
        back_populates="parent",
        cascade="all, delete-orphan"
    )

    seo_keyword: Mapped[str] = mapped_column(String(255), nullable=True)
    meta_title: Mapped[str] = mapped_column(String(255), nullable=True)
    meta_description: Mapped[str] = mapped_column(Text, nullable=True)
    meta_keyword: Mapped[str] = mapped_column(String(255), nullable=True)

    image: Mapped[str] = mapped_column(String(255), nullable=True)
    icon: Mapped[str] = mapped_column(String(255), nullable=True)

    status: Mapped[int] = mapped_column(Integer, default=CategoryStatus.ENABLED.value, nullable=False)
    sort_order: Mapped[int] = mapped_column(Integer, nullable=True)

    date_added: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
    date_modify: Mapped[datetime] = mapped_column(
        DateTime, default=datetime.utcnow, onupdate=datetime.utcnow
    )

    viewed: Mapped[int] = mapped_column(Integer, default=0, nullable=False)