""" Pydantic models for request/response validation. """ from pydantic import BaseModel from typing import Optional from enum import Enum class LeadStatus(str, Enum): new = "new" contacted = "contacted" replied = "replied" closed = "closed" class ScrapeRequest(BaseModel): query: str # e.g. "gym in Mumbai" limit: int = 50 lat: Optional[float] = None lng: Optional[float] = None zoom: int = 14 class ScrapeStatusResponse(BaseModel): status: str # "idle", "running", "completed", "failed" total_found: int = 0 message: str = "" class LeadCreate(BaseModel): name: str phone: Optional[str] = None address: Optional[str] = None website: Optional[str] = None email: Optional[str] = None instagram: Optional[str] = None linkedin: Optional[str] = None status: LeadStatus = LeadStatus.new notes: Optional[str] = "" class LeadUpdate(BaseModel): name: Optional[str] = None phone: Optional[str] = None address: Optional[str] = None website: Optional[str] = None email: Optional[str] = None instagram: Optional[str] = None linkedin: Optional[str] = None status: Optional[LeadStatus] = None notes: Optional[str] = None follow_up_date: Optional[str] = None class LeadResponse(BaseModel): id: int name: str phone: Optional[str] address: Optional[str] website: Optional[str] email: Optional[str] instagram: Optional[str] linkedin: Optional[str] status: str notes: Optional[str] follow_up_date: Optional[str] created_at: str class TemplateCreate(BaseModel): name: str content: str class TemplateUpdate(BaseModel): name: Optional[str] = None content: Optional[str] = None class TemplateResponse(BaseModel): id: int name: str content: str created_at: str class DashboardStats(BaseModel): total: int = 0 new: int = 0 contacted: int = 0 replied: int = 0 closed: int = 0