from pydantic import BaseModel, Field
from typing import List, Optional, Dict, Any
from datetime import datetime
from enum import Enum
import uuid

class SearchType(str, Enum):
    MANUAL = "manual"
    PERIODIC = "periodic"

class SearchStatus(str, Enum):
    PENDING = "pending"
    PROCESSING = "processing"
    COMPLETED = "completed"
    FAILED = "failed"

class SearchPlatform(str, Enum):
    GOOGLE = "google"
    BING = "bing"
    DUCKDUCKGO = "duckduckgo"
    REDDIT = "reddit"
    RSS = "rss"
    YOUTUBE = "youtube"
    INSTAGRAM = "instagram"
    LINKEDIN = "linkedin"
    TWITTER = "twitter"
    FACEBOOK = "facebook"

class SearchRequest(BaseModel):
    id: str = Field(default_factory=lambda: str(uuid.uuid4()))
    keywords: List[str]
    search_type: SearchType
    platforms: List[SearchPlatform]
    status: SearchStatus = SearchStatus.PENDING
    user_id: Optional[str] = None
    created_at: datetime = Field(default_factory=datetime.utcnow)
    updated_at: datetime = Field(default_factory=datetime.utcnow)
    scheduled_at: Optional[datetime] = None
    completed_at: Optional[datetime] = None
    metadata: Dict[str, Any] = Field(default_factory=dict)
    
    class Config:
        use_enum_values = True
        json_encoders = {
            datetime: lambda v: v.isoformat()
        }

class SearchTask(BaseModel):
    id: str = Field(default_factory=lambda: str(uuid.uuid4()))
    search_request_id: str
    platform: SearchPlatform
    keywords: List[str]
    status: SearchStatus = SearchStatus.PENDING
    created_at: datetime = Field(default_factory=datetime.utcnow)
    metadata: Dict[str, Any] = Field(default_factory=dict)
    
    class Config:
        use_enum_values = True
