from datetime import datetime
from typing import List, Optional

from pydantic import BaseModel, Field, HttpUrl, EmailStr


class StoreBase(BaseModel):
    name: str = Field(..., description="Назва магазину")
    seo_keyword: Optional[str] = None
    meta_title: Optional[str] = None
    meta_description: Optional[str] = None
    meta_keyword: Optional[str] = None
    website: Optional[str] = None
    # Social media URLs
    url_youtube: Optional[str] = None
    url_viber: Optional[str] = None
    url_facebook: Optional[str] = None
    url_telegram: Optional[str] = None
    # Логотип не беремо тут, бо приймаємо через UploadFile


class StoreCreate(StoreBase):
    rating: Optional[int] = 0
    description: Optional[str] = None
    address: Optional[str] = None
    phone: Optional[str] = None
    email: Optional[EmailStr] = None
    status: Optional[int] = None

    class Config:
        from_attributes = True


class StoreUpdate(BaseModel):
    name: Optional[str] = None
    description: Optional[str] = None
    address: Optional[str] = None
    phone: Optional[str] = None
    seo_keyword: Optional[str] = None
    meta_title: Optional[str] = None
    meta_description: Optional[str] = None
    meta_keyword: Optional[str] = None
    website: Optional[str] = None
    # Social media URLs
    url_youtube: Optional[str] = None
    url_viber: Optional[str] = None
    url_facebook: Optional[str] = None
    url_telegram: Optional[str] = None

    class Config:
        from_attributes = True


class StoreResponse(StoreBase):
    store_id: int
    date_added: datetime
    date_modify: datetime
    rating: int
    logo: Optional[HttpUrl] = Field(None, description="URL логотипа")
    photos: List["StorePhotoResponse"] = []
    addresses: List["StoreAddressResponse"] = []

    class Config:
        from_attributes = True


class StorePhotoBase(BaseModel):
    # image не беремо у Create/Update — приймаємо через UploadFile
    pass


class StorePhotoCreate(StorePhotoBase):
    store_id: int


class StorePhotoResponse(BaseModel):
    store_photo_id: int
    store_id: int
    image: str

    class Config:
        from_attributes = True


class ProductStoreCreate(BaseModel):
    product_id: int = Field(..., description="ID продукту")
    price: float = Field(..., ge=0, description="Ціна товару в магазині")
    price_old: Optional[float] = None

class AddStoreToProductRequest(BaseModel):
    store_id: int = Field(..., description="ID магазину")
    price: float = Field(..., ge=0, description="Ціна товару в магазині")
    price_old: Optional[float] = Field(None, description="Стара ціна товару")

    @classmethod
    def model_validate(cls, value):
        # Нормалізуємо price_old: 0 -> None
        if isinstance(value, dict) and value.get('price_old') == 0:
            value['price_old'] = None
        return super().model_validate(value)


class ProductStoreUpdate(BaseModel):
    price: Optional[float] = Field(None, ge=0, description="Нова ціна товару в магазині")
    price_old: Optional[float] = Field(None, description="Нова стара ціна товару")

class ProductStoreOut(BaseModel):
    product_store_id: int
    product_id: int
    store_id: int
    price: float
    date_added: datetime
    date_modify: datetime

    class Config:
        from_attributes = True


class StoreAddressBase(BaseModel):
    address: str
    phone_number: Optional[str] = None
    schedule: Optional[str] = None
    city_id: int
    zone_id: int


class StoreAddressCreate(BaseModel):
    address: str = Field(..., min_length=1)
    city_id: int
    zone_id: int
    phone_number: Optional[str] = None
    schedule: Optional[str] = None
    geolocation: Optional[str] = None


class StoreAddressUpdate(BaseModel):
    address: Optional[str] = None
    city_id: Optional[int] = None
    zone_id: Optional[int] = None
    phone_number: Optional[str] = None
    schedule: Optional[str] = None
    geolocation: Optional[str] = None


class StoreAddressFilter(BaseModel):
    city_id: Optional[int] = None
    zone_id: Optional[int] = None
    search: Optional[str] = None


class StoreAddressResponse(BaseModel):
    store_address_id: int
    store_id: int
    address: str
    city_id: int
    zone_id: int
    city_name: Optional[str] = Field(default=None)
    zone_name: Optional[str] = Field(default=None)
    phone_number: Optional[str]
    schedule: Optional[str]
    geolocation: Optional[str]
    date_added: datetime
    date_modify: datetime

    class Config:
        from_attributes = True


class StoreUpdateForm(BaseModel):
    name: str
    description: str
    phone: str
    email: str
    address: str
    status: int


class StoreOutSchema(BaseModel):
    store_id: int
    name: str
    description: Optional[str] = None
    address: Optional[str] = None
    phone: Optional[str] = None
    rating: Optional[int] = None
    email: Optional[str] = None
    website: Optional[str] = None
    # Social media URLs
    url_youtube: Optional[str] = None
    url_viber: Optional[str] = None
    url_facebook: Optional[str] = None
    url_telegram: Optional[str] = None

    status: Optional[int] = None
    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

    model_config = {
        "from_attributes": True
    }


class StoreListResponse(BaseModel):
    data: List[StoreOutSchema]
    total: int
    page: int
    limit: int
    status: bool


StoreResponse.update_forward_refs()