"""Pydantic data models for Google Maps scraper."""

from __future__ import annotations

from datetime import datetime
from typing import Optional

from pydantic import BaseModel, Field


class PlaceDetails(BaseModel):
    """Structured details about a Google Maps place."""

    name: Optional[str] = None
    place_id: Optional[str] = None
    address: Optional[str] = None
    rating: Optional[float] = None
    review_count: Optional[int] = None
    phone: Optional[str] = None
    website: Optional[str] = None
    category: Optional[str] = None
    price_level: Optional[str] = None
    hours: Optional[list[str]] = None
    latitude: Optional[float] = None
    longitude: Optional[float] = None
    plus_code: Optional[str] = None
    url: Optional[str] = None
    google_maps_url: Optional[str] = None
    image_url: Optional[str] = None
    description: Optional[str] = None
    photos_count: Optional[int] = None

    # Additional details
    permanently_closed: bool = False
    temporarily_closed: bool = False


class ScrapeResult(BaseModel):
    """Result of scraping a single Google Maps URL."""

    input_url: str
    place: Optional[PlaceDetails] = None
    success: bool = True
    error: Optional[str] = None
    scraped_at: datetime = Field(default_factory=datetime.now)


class ScrapeConfig(BaseModel):
    """Configuration for the scraper."""

    concurrency: int = Field(default=5, ge=1, le=50)
    timeout: int = Field(default=30000, description="Page load timeout in ms")
    headless: bool = True
    language: Optional[str] = None
    max_retries: int = 3
    delay_min: float = 1.0
    delay_max: float = 3.0
    save_interval: int = Field(
        default=50,
        description="Save results every N items for crash recovery",
    )
    proxy: Optional[str] = None
