from typing import Optional, List
from datetime import datetime
from pydantic import BaseModel


class ScrapingResultItem(BaseModel):
    """Single scraping result for a vendor or discovery source."""
    vendor_id: Optional[str] = None
    vendor_name: str
    vendor_url: str
    scraped_price: Optional[float]
    msp: float
    status: str  # 'compliant', 'violation', 'complaining', 'unknown'
    price_difference: Optional[float]
    percentage_difference: Optional[float]


class ViolationItem(BaseModel):
    """Violation record from scraping."""
    vendor_id: Optional[str] = None
    vendor_name: str
    product_name: str
    scraped_price: float
    msp: float
    price_difference: Optional[float]


class ScrapingResponse(BaseModel):
    """Response from scraping endpoint.

    - `scraped_count` represents the total number of lookup attempts,
      including registered vendors and discovered alternative vendors when `enable_discovery` is true.
    - `results` includes entries for all scraped sources: registered vendors and discovered ones.
    """
    product_id: int
    product_name: str
    msp: float
    scraped_count: int
    violation_count: int
    results: List[ScrapingResultItem]
    violations: List[ViolationItem]
    execution_time: str


class ScrapingResultDB(BaseModel):
    """Database model for scraping result."""
    id: str
    product_id: int
    vendor_id: str
    product_name: str
    barcode: Optional[str]
    reference_id: Optional[str]
    vendor_name: str
    vendor_url: str
    msp: float
    scraped_price: Optional[float]
    price_difference: Optional[float]
    percentage_difference: Optional[float]
    compliance_status: str
    source_type: str
    scraped_at: datetime

    class Config:
        from_attributes = True
