import enum
from datetime import datetime
from typing import Optional, List

from sqlalchemy import String, Text, ForeignKey, Enum, DateTime, Integer, UniqueConstraint, Boolean
from sqlalchemy.orm import Mapped, mapped_column, relationship

from src.database import Base

class CurrentCart(Base):
    __tablename__ = "current_cart_product"

    current_cart_product_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    customer_id: Mapped[int] = mapped_column(Integer, nullable=False)
    product_id: Mapped[int] = mapped_column(Integer, nullable=False)
    quantity: Mapped[int] = mapped_column(Integer, nullable=False)
    store_id: Mapped[int] = mapped_column(Integer, nullable=False)

    date_added: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)

    __table_args__ = (
        UniqueConstraint("customer_id", "product_id", name="uq_customer_product"),
    )

class Cart(Base):
    __tablename__ = "cart"

    cart_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    customer_id: Mapped[int] = mapped_column(Integer, nullable=False)
    name: Mapped[str] = mapped_column(String(255), nullable=False)

    date_added: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
    date_updated: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)

    # связь "один ко многим" с CartProduct
    products: Mapped[list["CartProduct"]] = relationship(
        "CartProduct",
        back_populates="cart",
        cascade="all, delete-orphan"
    )

class CartProduct(Base):
    __tablename__ = "cart_product"

    cart_product_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)

    cart_id: Mapped[int] = mapped_column(
        Integer,
        ForeignKey("cart.cart_id", ondelete="CASCADE"),  # FK к корзине
        nullable=False
    )
    product_id: Mapped[int] = mapped_column(Integer, nullable=False)
    quantity: Mapped[int] = mapped_column(Integer, nullable=False)
    store_id: Mapped[int] = mapped_column(Integer, nullable=False)

    # обратная связь к Cart
    cart: Mapped["Cart"] = relationship("Cart", back_populates="products")

class SharedCart(Base):
    __tablename__ = "shared_cart"

    shared_cart_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    original_cart_id: Mapped[int] = mapped_column(Integer, nullable=False)
    customer_id: Mapped[int] = mapped_column(Integer, nullable=False)
    name: Mapped[str] = mapped_column(String(255), nullable=False)
    seo_keyword: Mapped[str] = mapped_column(String(255), nullable=False, unique=True)

    date_added: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)

    # связь "один ко многим" с SharedCartProduct
    products: Mapped[list["SharedCartProduct"]] = relationship(
        "SharedCartProduct",
        back_populates="shared_cart",
        cascade="all, delete-orphan"
    )

class SharedCartProduct(Base):
    __tablename__ = "shared_cart_product"

    shared_cart_product_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)

    shared_cart_id: Mapped[int] = mapped_column(
        Integer,
        ForeignKey("shared_cart.shared_cart_id", ondelete="CASCADE"),
        nullable=False
    )
    product_id: Mapped[int] = mapped_column(Integer, nullable=False)
    quantity: Mapped[int] = mapped_column(Integer, nullable=False)
    store_id: Mapped[int] = mapped_column(Integer, nullable=False)

    # обратная связь к SharedCart
    shared_cart: Mapped["SharedCart"] = relationship("SharedCart", back_populates="products")

class SelectedProduct(Base):
    __tablename__ = "selected_product"
    selected_product_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    product_id: Mapped[int] = mapped_column(Integer, nullable=False)
    customer_id: Mapped[int] = mapped_column(Integer, nullable=False)