import enum
from datetime import datetime

from sqlalchemy import String, DateTime, Float, Text, Integer, ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship

from src.database import Base

class ManufacturerStatus(enum.IntEnum):
    OFF = 0
    ON = 1

class Manufacturer(Base):
    __tablename__ = 'manufacturer'

    manufacturer_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    name: Mapped[str] = mapped_column(String(255), nullable=False)
    description: Mapped[Text] = mapped_column(Text, nullable=True)
    address: Mapped[str] = mapped_column(String(255), nullable=True)
    phone: Mapped[str] = mapped_column(String(100), nullable=True)
    email: Mapped[str] = mapped_column(String(255), nullable=True)
    status: Mapped[int] = mapped_column(Integer, default=ManufacturerStatus.OFF.value, nullable=False)
    date_added: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
    date_modify: Mapped[datetime] = mapped_column(
        DateTime, default=datetime.utcnow, onupdate=datetime.utcnow
    )
    rating: Mapped[float] = mapped_column(Float, default=0)
    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)
    logo: Mapped[str] = mapped_column(Text, nullable=True)
    viewed: Mapped[int] = mapped_column(Integer, default=0, nullable=False)

    photos: Mapped[list["ManufacturerPhoto"]] = relationship(back_populates="manufacturer", cascade="all, delete")

class ManufacturerPhoto(Base):
    __tablename__ = "manufacturer_photo"

    manufacturer_photo_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    manufacturer_id: Mapped[int] = mapped_column(ForeignKey("manufacturer.manufacturer_id", ondelete="CASCADE"))
    image: Mapped[str] = mapped_column(Text, nullable=False)

    manufacturer: Mapped[Manufacturer] = relationship(back_populates="photos")