"""Pydantic models for the scraper application."""

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

class ScrapeType(str, Enum):
    SEARCH = "search"
    NEWS = "news"
    IMAGES = "images"
    VIDEOS = "videos"

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

class ScrapeRequest(BaseModel):
    query: str = Field(..., description="Search query")
    scrape_type: ScrapeType = Field(default=ScrapeType.SEARCH, description="Type of scraping")
    max_results: int = Field(default=10, ge=1, le=100, description="Maximum results per engine")
    engines: Optional[List[str]] = Field(default=["all"], description="Search engines to use")
    
    class Config:
        use_enum_values = True

class ScrapeResponse(BaseModel):
    task_id: str
    status: ScrapeStatus
    message: str
    engines: List[str]

class SearchResult(BaseModel):
    title: str
    url: str
    description: str
    engine: str
    position: int
    timestamp: datetime = Field(default_factory=datetime.now)

class ScrapeResult(BaseModel):
    task_id: str
    query: str
    scrape_type: ScrapeType
    results: List[SearchResult]
    timestamp: datetime = Field(default_factory=datetime.now)
    status: ScrapeStatus
    engines: List[str]
    metadata: Optional[Dict[str, Any]] = None

class DeleteResponse(BaseModel):
    message: str
    deleted_count: int

class EnginesResponse(BaseModel):
    available_engines: List[str]
    description: Dict[str, str]

class HealthResponse(BaseModel):
    status: str
    timestamp: datetime = Field(default_factory=datetime.now)
    services: Dict[str, bool]
