from datetime import datetime
from typing import List, Optional, TypeVar, Generic

from pydantic import BaseModel, Field
from pydantic.generics import GenericModel

class ProductCategoryOut(BaseModel):
    category_id: int
    name: str
    product_count: Optional[int] = 0  # Додано: кількість товарів в категорії

    model_config = {
        "from_attributes": True
    }

class ProductAttributeOut(BaseModel):
    group_name: str
    name: str
    value: str

    model_config = {
        "from_attributes": True
    }

class ProductImageOut(BaseModel):
    image: str

    model_config = {
        "from_attributes": True
    }

class ProductOut(BaseModel):
    product_id: int
    name: str
    status: int
    date_added: str
    model: str | None
    price: float
    price_old: float | None
    seo_keyword: str | None
    manufacturer_id: int | None
    rating: float
    viewed: int
    image: str | None
    reviews_count: Optional[int] = 0  # Додано: кількість відгуків про товар
    images: List[ProductImageOut] = []
    categories: List[ProductCategoryOut] = []
    attributes: List[ProductAttributeOut] = []

    model_config = {
        "from_attributes": True
    }

class StorePhotoOut(BaseModel):
    store_photo_id: int
    image: str

class StoreAddressOut(BaseModel):
    store_address_id: int
    address: str
    phone_number: Optional[str] = None
    schedule: Optional[str] = None
    geolocation: Optional[str] = None
    city_id: int
    zone_id: int

class StoreOut(BaseModel):
    store_id: int
    name: str
    description: Optional[str] = None
    address: Optional[str] = None
    phone: Optional[str] = None
    email: Optional[str] = None
    website: Optional[str] = None
    url_youtube: Optional[str] = None
    url_viber: Optional[str] = None
    url_facebook: Optional[str] = None
    url_telegram: Optional[str] = None
    status: int
    viewed: int
    date_added: Optional[str] = None
    date_modify: Optional[str] = None
    rating: Optional[int] = None
    seo_keyword: Optional[str] = None
    meta_title: Optional[str] = None
    meta_description: Optional[str] = None
    meta_keyword: Optional[str] = None
    logo: Optional[str] = None
    reviews_count: Optional[int] = 0  # Додано: кількість відгуків магазину

class ResponseWrapperStoreTop(BaseModel):
    data: List[StoreOut]
    status: bool

class ResponseWrapperStore(BaseModel):
    data: List[StoreOut]
    status: bool
    total: int
    page: int
    limit: int
class ManufacturerPhotoOut(BaseModel):
    image: str

    model_config = {
        "from_attributes": True
    }

class ManufacturerOut(BaseModel):
    manufacturer_id: int
    name: str
    description: str | None
    address: str | None
    phone: str | None
    email: str | None
    status: int
    viewed: int
    rating: float | None
    logo: str | None
    date_added: datetime
    date_modify: datetime
    seo_keyword: str | None
    reviews_count: Optional[int] = 0  # Додано: кількість відгуків виробника

    model_config = {
        "from_attributes": True
    }
class CustomerOut(BaseModel):
    name: str
    photo: Optional[str]

class ReviewOut(BaseModel):
    id: int
    text: str
    date_added: datetime
    type: str
    rating: int
    customer: Optional[CustomerOut]

class ResponseWrapperReview(BaseModel):
    status: bool
    data: List[ReviewOut]

class ResponseWrapper(BaseModel):
    data: list
    status: bool

class DayProductResponseWrapper(BaseModel):
    data: ProductOut | None
    status: bool

class StoreReviewCreate(BaseModel):
    text: str = Field(..., description="Текст відгуку")
    rating: int = Field(..., ge=1, le=5, description="Оцінка")
    store_id: int = Field(..., description="ID магазину")

class ManufacturerReviewCreate(BaseModel):
    manufacturer_id: int
    text: str
    rating: int = Field(..., ge=1, le=5, description="Оцінка")

class ServiceReviewCreate(BaseModel):
    text: str
    rating: int = Field(..., ge=1, le=5, description="Оцінка")

class ProductReviewCreate(BaseModel):
    product_id: int
    text: str
    rating: int = Field(..., ge=1, le=5, description="Оцінка")

class CustomerOutReview(BaseModel):
    customer_id: int
    name: str
    phone: str
    email: Optional[str]
    comment: Optional[str]
    logo: Optional[str]
    date_added: Optional[str]
    date_modify: Optional[str]
    ip: Optional[str]
    auth_type: str
    banned: bool

    model_config = {"from_attributes": True}

class ReviewResponseOut(BaseModel):
    response_id: int
    review_type: str
    review_id: int
    author_type: str = "customer"  # Завжди customer
    author_id: int
    author_name: str
    response_text: str
    date_added: Optional[str]
    date_modify: Optional[str]
    status: str

    model_config = {"from_attributes": True}

class ProductReviewOut(BaseModel):
    product_review_id: Optional[int]
    product_id: Optional[int]
    manufacturer_id: Optional[int]
    date_added: Optional[str]
    date_modify: Optional[str]
    status: Optional[str]
    text: Optional[str]
    rating: Optional[int]
    ip: Optional[str]
    has_response: Optional[bool] = False

    customer: Optional[CustomerOutReview]
    responses: List[ReviewResponseOut] = []  # Відповіді на відгук

    model_config = {"from_attributes": True}

T = TypeVar("T")

class ResponseWrapperReviewProduct(GenericModel, Generic[T]):
    data: T
    status: bool

class StoreOutReview(BaseModel):
    store_id: int
    name: str
    logo: Optional[str] = None
    website: Optional[str] = None
    url_youtube: Optional[str] = None
    url_viber: Optional[str] = None
    url_facebook: Optional[str] = None
    url_telegram: Optional[str] = None
    date_added: Optional[str] = None
    date_modify: Optional[str] = None
    reviews_count: Optional[int] = 0  # Додано: кількість відгуків магазину

    model_config = {"from_attributes": True}

class StoreReviewOut(BaseModel):
    store_review_id: Optional[int]
    store_id: Optional[int]
    customer_id: Optional[int]
    date_added: Optional[str]
    date_modify: Optional[str]
    status: Optional[str]
    text: Optional[str]
    rating: Optional[int]
    ip: Optional[str]
    has_response: Optional[bool] = False

    customer: Optional[CustomerOutReview]
    store: Optional[StoreOutReview]
    responses: List[ReviewResponseOut] = []  # Відповіді на відгук

    model_config = {"from_attributes": True}

class ResponseWrapperReviewStore(GenericModel, Generic[T]):
    data: T
    status: bool

class ManufacturerOutReview(BaseModel):
    manufacturer_id: int
    name: str
    logo: Optional[str] = None
    date_added: Optional[str] = None
    date_modify: Optional[str] = None
    reviews_count: Optional[int] = 0  # Додано: кількість відгуків виробника

    model_config = {"from_attributes": True}

class ManufacturerReviewOut(BaseModel):
    manufacturer_review_id: Optional[int]
    manufacturer_id: Optional[int]
    customer_id: Optional[int]
    date_added: Optional[str]
    date_modify: Optional[str]
    status: Optional[str]
    text: Optional[str]
    rating: Optional[int]
    ip: Optional[str]
    has_response: Optional[bool] = False

    customer: Optional[CustomerOutReview]
    manufacturer: Optional[ManufacturerOutReview]
    responses: List[ReviewResponseOut] = []  # Відповіді на відгук

    model_config = {"from_attributes": True}
class ServiceReviewOut(BaseModel):
    service_review_id: Optional[int]
    customer_id: Optional[int]
    date_added: Optional[str]
    date_modify: Optional[str]
    status: Optional[str]
    text: Optional[str]
    rating: Optional[int]
    ip: Optional[str]
    has_response: Optional[bool] = False

    customer: Optional[CustomerOutReview]
    responses: List[ReviewResponseOut] = []  # Відповіді на відгук

    model_config = {"from_attributes": True}

class ReviewResponseCreate(BaseModel):
    response_text: str

class ResponseWrapperReviewManufacturer(GenericModel, Generic[T]):
    data: T
    status: bool

class ResponseWrapperReviewService(GenericModel, Generic[T]):
    data: T
    status: bool



class ReviewResponseCreate(BaseModel):
    response_text: str = Field(..., description="Текст відповіді")

    model_config = {
        "json_schema_extra": {
            "example": {
                "response_text": "Дякуємо за ваш відгук! Ми обов'язково врахуємо ваші зауваження."
            }
        }
    }

class ResponseWrapperReviewResponse(BaseModel):
    data: Optional[ReviewResponseOut]
    status: bool
    message: Optional[str] = None

class ResponseWrapperReviewResponses(BaseModel):
    data: List[ReviewResponseOut]
    status: bool
    total: int