import enum
from datetime import datetime
from sqlalchemy import String, DateTime, Integer, Text, ForeignKey, Float
from sqlalchemy.orm import Mapped, mapped_column, relationship

from src.address.models import City, Zone
from src.database import Base

class StoreStatus(enum.IntEnum):
    OFF = 0
    ON = 1


class Store(Base):
    __tablename__ = "store"

    store_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)
    website: Mapped[str] = mapped_column(String(255), nullable=True)
    url_youtube: Mapped[str] = mapped_column(String(255), nullable=True)
    url_viber: Mapped[str] = mapped_column(String(255), nullable=True)
    url_facebook: Mapped[str] = mapped_column(String(255), nullable=True)
    url_telegram: Mapped[str] = mapped_column(String(255), nullable=True)
    status: Mapped[int] = mapped_column(Integer, default=StoreStatus.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[int] = mapped_column(Integer, 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["StorePhoto"]] = relationship(back_populates="store", cascade="all, delete")
    addresses: Mapped[list["StoreAddress"]] = relationship(back_populates="store", cascade="all, delete")
    product_links: Mapped[list["ProductStore"]] = relationship(back_populates="store", cascade="all, delete")

class StorePhoto(Base):
    __tablename__ = "store_photo"

    store_photo_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    store_id: Mapped[int] = mapped_column(ForeignKey("store.store_id", ondelete="CASCADE"))
    image: Mapped[str] = mapped_column(Text, nullable=False)

    store: Mapped["Store"] = relationship(back_populates="photos")

class ProductStore(Base):
    __tablename__ = "product_store"

    product_store_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    product_id: Mapped[int] = mapped_column(ForeignKey("product.product_id", ondelete="CASCADE"))
    store_id: Mapped[int] = mapped_column(ForeignKey("store.store_id", ondelete="CASCADE"))
    date_added: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
    date_modify: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    price: Mapped[float] = mapped_column(Float, nullable=False)
    price_old: Mapped[float] = mapped_column(Float, nullable=True)

    store: Mapped["Store"] = relationship(back_populates="product_links")
    product: Mapped["Product"] = relationship("Product", back_populates="product_links")

class StoreAddress(Base):
    __tablename__ = "store_address"

    store_address_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    store_id: Mapped[int] = mapped_column(ForeignKey("store.store_id", ondelete="CASCADE"))
    address: Mapped[str] = mapped_column(Text, nullable=False)
    phone_number: Mapped[str] = mapped_column(Text, nullable=True)
    schedule: Mapped[str] = mapped_column(Text, nullable=True)
    geolocation: Mapped[str] = mapped_column(String(1028), 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)
    city_id: Mapped[int] = mapped_column(ForeignKey("city.city_id", ondelete="CASCADE"), nullable=False)
    zone_id: Mapped[int] = mapped_column(ForeignKey("zone.zone_id", ondelete="CASCADE"), nullable=False)

    store: Mapped["Store"] = relationship(back_populates="addresses")

    city: Mapped["City"] = relationship()
    zone: Mapped["Zone"] = relationship()
