from datetime import datetime
from typing import Optional, Annotated, List

from fastapi import Form
from pydantic import BaseModel, Field, EmailStr

from src.manufacturer.models import ManufacturerStatus


class ManufacturerBase(BaseModel):
    name: str
    rating: float
    seo_keyword: Optional[str] = None
    meta_title: Optional[str] = None
    meta_description: Optional[str] = None
    meta_keyword: Optional[str] = None
    logo: Optional[str] = None

class ManufacturerCreate(ManufacturerBase):
    pass

class ManufacturerUpdate(BaseModel):
    name: Optional[str] = None
    rating: Optional[float] = None
    seo_keyword: Optional[str] = None
    meta_title: Optional[str] = Field(default=None, alias="meta-title")
    meta_description: Optional[str] = None
    meta_keyword: Optional[str] = None
    logo: Optional[str] = None

class ManufacturerResponse(ManufacturerBase):
    manufacturer_id: int
    date_added: datetime
    date_modify: datetime

    class Config:
        from_attributes = True

class ManufacturerCreateForm(BaseModel):
    name: Annotated[str, Form()]
    address: Annotated[Optional[str], Form()] = None
    description: Annotated[Optional[str], Form()] = None
    phone: Annotated[Optional[str], Form()] = None
    email: Optional[Annotated[EmailStr, Form()]] = None
    status: Annotated[Optional[int], Form()] = ManufacturerStatus.OFF.value
    seo_keyword: Annotated[Optional[str], Form()] = None
    meta_title: Annotated[Optional[str], Form()] = None
    meta_description: Annotated[Optional[str], Form()] = None
    meta_keyword: Annotated[Optional[str], Form()] = None

class ManufacturerUpdateForm(BaseModel):
    name: Optional[Annotated[str, Form()]] = None
    seo_keyword: Optional[Annotated[str, Form()]] = None
    email: Optional[Annotated[EmailStr, Form()]] = None
    status: Optional[int] = None
    meta_title: Optional[Annotated[str, Form()]] = None
    meta_description: Optional[Annotated[str, Form()]] = None
    meta_keyword: Optional[Annotated[str, Form()]] = None

class ManufacturerOutSchema(BaseModel):
    manufacturer_id: int
    name: str
    rating: Optional[float] = None
    address: Optional[str] = None
    description: Optional[str] = None
    phone: Optional[str] = None
    email: Optional[EmailStr] = None
    status: int
    date_added: datetime
    date_modify: datetime
    meta_title: Optional[str] = None
    meta_keyword: Optional[str] = None
    seo_keyword: Optional[str] = None
    meta_description: Optional[str] = None
    logo: Optional[str] = None
    product_count: int
    reviews_count: int

    class Config:
        from_attributes = True

class ManufacturerListResponse(BaseModel):
    data: List[ManufacturerOutSchema]
    total: int
    page: int
    limit: int
    status: bool

class ManufacturerPhotoResponse(BaseModel):
    manufacturer_photo_id: int
    manufacturer_id: int
    image: str

    class Config:
        from_attributes = True