import enum
from datetime import datetime

from sqlalchemy import ForeignKey, DateTime, Enum, Text, Integer, String, Boolean
from sqlalchemy.orm import mapped_column, Mapped, relationship

from src.customer.models import Customer
from src.database import Base
from src.manufacturer.models import Manufacturer
from src.product.models import Product
from src.store.models import Store


class ReviewStatusEnum(enum.Enum):
    new = 0
    approved = 1
    rejected = 2


class ReviewResponse(Base):
    __tablename__ = "review_response"

    response_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    review_type: Mapped[str] = mapped_column(String(50), nullable=False)  # product, store, manufacturer, service
    review_id: Mapped[int] = mapped_column(Integer, nullable=False)  # ID отзыва в зависимости от типа

    author_type: Mapped[str] = mapped_column(String(50), nullable=False)
    author_id: Mapped[int] = mapped_column(Integer, nullable=True)
    author_name: Mapped[str] = mapped_column(String(255), nullable=False)

    response_text: Mapped[str] = mapped_column(Text, 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)

    status: Mapped[ReviewStatusEnum] = mapped_column(Enum(ReviewStatusEnum), default=ReviewStatusEnum.new,
                                                     nullable=False)
    ip: Mapped[str] = mapped_column(String(75), nullable=True)



class StoreReview(Base):
    __tablename__ = "store_review"

    store_review_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    store_id: Mapped[int] = mapped_column(ForeignKey("store.store_id", ondelete="CASCADE"))
    customer_id: Mapped[int] = mapped_column(ForeignKey("customer.customer_id", ondelete="CASCADE"), 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
    )

    status: Mapped[ReviewStatusEnum] = mapped_column(Enum(ReviewStatusEnum), default=ReviewStatusEnum.new,
                                                     nullable=False)
    text: Mapped[str] = mapped_column(Text)
    rating: Mapped[int] = mapped_column(Integer)
    ip: Mapped[str] = mapped_column(String(75))

    # Добавить поле для отслеживания наличия ответа
    has_response: Mapped[bool] = mapped_column(Boolean, default=False)

    store: Mapped["Store"] = relationship("Store")
    customer: Mapped["Customer"] = relationship("Customer")


class ManufacturerReview(Base):
    __tablename__ = "manufacturer_review"

    manufacturer_review_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    manufacturer_id: Mapped[int] = mapped_column(ForeignKey("manufacturer.manufacturer_id", ondelete="CASCADE"))
    customer_id: Mapped[int] = mapped_column(ForeignKey("customer.customer_id", ondelete="CASCADE"), 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)

    status: Mapped[ReviewStatusEnum] = mapped_column(Enum(ReviewStatusEnum), default=ReviewStatusEnum.new,
                                                     nullable=False)
    text: Mapped[str] = mapped_column(Text)
    rating: Mapped[int] = mapped_column(Integer)
    ip: Mapped[str] = mapped_column(String(75))

    # Добавить поле для отслеживания наличия ответа
    has_response: Mapped[bool] = mapped_column(Boolean, default=False)

    manufacturer: Mapped["Manufacturer"] = relationship("Manufacturer")
    customer: Mapped["Customer"] = relationship("Customer")


class ServiceReview(Base):
    __tablename__ = "service_review"

    service_review_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    customer_id: Mapped[int] = mapped_column(ForeignKey("customer.customer_id", ondelete="CASCADE"), 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)

    status: Mapped[ReviewStatusEnum] = mapped_column(Enum(ReviewStatusEnum), default=ReviewStatusEnum.new,
                                                     nullable=False)
    text: Mapped[str] = mapped_column(Text)
    rating: Mapped[int] = mapped_column(Integer)
    ip: Mapped[str] = mapped_column(String(75))

    # Добавить поле для отслеживания наличия ответа
    has_response: Mapped[bool] = mapped_column(Boolean, default=False)

    customer: Mapped["Customer"] = relationship("Customer")


class ProductReview(Base):
    __tablename__ = "product_review"

    product_review_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    product_id: Mapped[int] = mapped_column(ForeignKey("product.product_id", ondelete="CASCADE"))
    customer_id: Mapped[int] = mapped_column(ForeignKey("customer.customer_id", ondelete="CASCADE"), nullable=True)
    manufacturer_id: Mapped[int] = mapped_column(ForeignKey("manufacturer.manufacturer_id", ondelete="CASCADE"),
                                                 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)

    status: Mapped[ReviewStatusEnum] = mapped_column(Enum(ReviewStatusEnum), default=ReviewStatusEnum.new,
                                                     nullable=False)
    text: Mapped[str] = mapped_column(Text)
    rating: Mapped[int] = mapped_column(Integer)
    ip: Mapped[str] = mapped_column(String(75))

    has_response: Mapped[bool] = mapped_column(Boolean, default=False)

    product: Mapped["Product"] = relationship("Product")
    customer: Mapped["Customer"] = relationship("Customer")
    manufacturer: Mapped["Manufacturer"] = relationship("Manufacturer")