from typing import List, Optional
from pydantic import BaseModel,validator
from datetime import datetime
from pydantic import Field
from uuid import uuid4, UUID

class RelatedTopic(BaseModel):
    id: str = Field(default_factory=lambda: str(uuid4()))
    topic_id: str
    topic_name: str
   
class SearchResponse(BaseModel):
    id: str = Field(default_factory=lambda: str(uuid4()))
    title: str
    link: str
    snippet: str
    photo_url: Optional[str]
    thumbnail_url: Optional[str]
    published_datetime_utc: datetime
    authors: List[str]
    source_url: str
    source_name: str
    source_logo_url: Optional[str]
    source_favicon_url: Optional[str]
    source_publication_id: str
    related_topics: List[RelatedTopic]
    processed: bool = False

    @validator("source_logo_url", "photo_url", "thumbnail_url", "source_favicon_url", pre=True)
    def convert_str_none_to_none(cls, v):
        if isinstance(v, str) and v.lower() == "none":
            return None
        return v
    
    class Config:
        use_enum_values = True
        json_encoders = {
            datetime: lambda v: v.isoformat()
        }


class NewsResponse(BaseModel):
    id: str = Field(default_factory=lambda: str(uuid4()))
    status: str
    request_id: str
    data: List[SearchResponse]
    