from datetime import datetime
from enum import Enum
from typing import Optional, List
from pydantic import BaseModel, Field

from src.review.models import ReviewStatusEnum


class CustomerBrief(BaseModel):
    customer_id: int = None
    name: str = None
    phone: Optional[str] = None
    logo: Optional[str] = None

    model_config = {
        "from_attributes": True
    }

class SortOrder(str, Enum):
    asc = "asc"
    desc = "desc"

class SortField(str, Enum):
    rating = "rating"
    date_added = "date_added"

class StoreReviewResponse(BaseModel):
    store_review_id: int
    store_id: int
    store_name: Optional[str] = None
    date_added: datetime
    date_modify: Optional[datetime] = None
    status: int
    text: str
    rating: int
    ip: Optional[str] = None

    customer: CustomerBrief = None

    model_config = {
        "from_attributes": True
    }

class DashboardReviewStats(BaseModel):
    total_quantity: int
    medium_rating: float


class StoreReviewListResponse(BaseModel):
    data: List[StoreReviewResponse]
    dashboard: DashboardReviewStats
    status: bool
    total: int
    page: int
    limit: int

class StoreReviewUpdateRequest(BaseModel):
    status: ReviewStatusEnum

class ManufacturerReviewResponse(BaseModel):
    manufacturer_review_id: int
    manufacturer_id: int
    manufacturer_name: Optional[str] = None
    customer_id: int
    text: str
    rating: int
    status: int
    date_added: datetime
    date_modify: Optional[datetime] = None
    customer: Optional[CustomerBrief] = None

    model_config = {
        "from_attributes": True
    }

class DashboardReviewStats(BaseModel):
    total_quantity: int
    medium_rating: float


class ManufacturerReviewListResponse(BaseModel):
    data: List[ManufacturerReviewResponse]
    dashboard: DashboardReviewStats
    status: bool
    total: int
    page: int
    limit: int

class ProductReviewResponse(BaseModel):
    product_review_id: int
    product_id: Optional[int] = None
    product_name: Optional[str] = None
    customer_id: Optional[int] = None
    manufacturer_id: Optional[int] = None
    manufacturer_name: Optional[str] = None
    text: str
    rating: int
    status: int
    ip: str
    date_added: datetime
    date_modify: Optional[datetime] = None
    customer: Optional[CustomerBrief] = None

    model_config = {
        "from_attributes": True
    }

class ProductReviewDashboard(BaseModel):
    total_quantity: int
    medium_rating: float

class ProductReviewListResponse(BaseModel):
    data: List[ProductReviewResponse]
    dashboard: ProductReviewDashboard
    status: bool
    total: int
    page: int
    limit: int

class ServiceReviewResponse(BaseModel):
    service_review_id: int
    customer_id: Optional[int] = None
    text: str
    rating: int
    status: int
    ip: str
    date_added: datetime
    date_modify: datetime
    customer: Optional[CustomerBrief] = None

    model_config = {
        "from_attributes": True
    }


class ServiceReviewDashboard(BaseModel):
    total_quantity: int
    medium_rating: float

class ServiceReviewListResponse(BaseModel):
    data: List[ServiceReviewResponse]
    dashboard: ServiceReviewDashboard
    status: bool
    total: int
    page: int
    limit: int