from datetime import datetime
from typing import Optional, List
from uuid import UUID
from pydantic import BaseModel, Field, ConfigDict


# KPI Summary Schemas
class ActiveViolationsKPI(BaseModel):
    """KPI card for active violations."""
    total_active_violations: int = Field(..., description="Total count of active violations")
    total_detections: int = Field(..., description="Total detection count across all violations")
    offending_vendors_count: int = Field(..., description="Number of unique vendors with violations")
    affected_products_count: int = Field(..., description="Number of unique products with violations")
    status: str = Field(default="critical", description="Status indicator: 'critical', 'active', or 'low'")

    model_config = ConfigDict(from_attributes=True)


class MonitoredProductsKPI(BaseModel):
    """KPI card for monitored products."""
    total_monitored_products: int = Field(..., description="Total number of monitored products")

    model_config = ConfigDict(from_attributes=True)


class AveragePriceDiscountKPI(BaseModel):
    """KPI card for average discount percentage."""
    average_discount_percentage: float = Field(..., description="Average discount % across active violations")

    model_config = ConfigDict(from_attributes=True)


class KPISummary(BaseModel):
    """KPI summary section of dashboard."""
    active_violations: ActiveViolationsKPI
    monitored_products: MonitoredProductsKPI
    average_discount: AveragePriceDiscountKPI

    model_config = ConfigDict(from_attributes=True)


# Trend Chart Schemas
class TrendDataPoint(BaseModel):
    """Single data point for the 30-day violation trend."""
    date: str = Field(..., description="Date in YYYY-MM-DD format")
    violation_count: int = Field(..., description="Number of violations on this date")

    model_config = ConfigDict(from_attributes=True)


class ViolationTrendChart(BaseModel):
    """30-day violation trend chart data."""
    trend_data: List[TrendDataPoint] = Field(..., description="List of violation counts per day for last 30 days")
    period_label: str = Field(default="Last 30 Days", description="Period label")

    model_config = ConfigDict(from_attributes=True)


# Violation Analysis Schemas
class MarketplaceAnalysis(BaseModel):
    """Data for marketplace with most violations."""
    marketplace_name: str = Field(..., description="Name of the marketplace")
    violation_count: int = Field(..., description="Total violations from this marketplace")

    model_config = ConfigDict(from_attributes=True)


class VendorAnalysis(BaseModel):
    """Data for most offending vendor."""
    vendor_name: str = Field(..., description="Name of the vendor")
    violation_count: int = Field(..., description="Number of violations from this vendor")

    model_config = ConfigDict(from_attributes=True)


class ProductAnalysis(BaseModel):
    """Data for most affected product."""
    product_name: str = Field(..., description="Name of the product")
    violation_count: int = Field(..., description="Number of violations for this product")

    model_config = ConfigDict(from_attributes=True)


class HighestDiscountAnalysis(BaseModel):
    """Data for highest discount detected."""
    product_name: str = Field(..., description="Name of the product with highest discount")
    highest_discount_percentage: float = Field(..., description="Highest discount percentage detected")
    msp: float = Field(..., description="Manufacturer Suggested Price")
    scraped_price: float = Field(..., description="Actual scraped price")

    model_config = ConfigDict(from_attributes=True)


class FinancialImpactAnalysis(BaseModel):
    """Data for estimated financial impact."""
    total_estimated_impact: float = Field(..., description="Total estimated impact in currency")
    currency: str = Field(default="USD", description="Currency of the financial impact")
    violation_count: int = Field(..., description="Number of violations contributing to impact")

    model_config = ConfigDict(from_attributes=True)


class ViolationAnalysis(BaseModel):
    """Violation analysis section of dashboard."""
    marketplace_with_most_violations: Optional[MarketplaceAnalysis] = Field(None, description="Marketplace with most violations")
    most_offending_vendor: Optional[VendorAnalysis] = Field(None, description="Vendor with most violations")
    most_affected_product: Optional[ProductAnalysis] = Field(None, description="Product with most violations")
    highest_discount_detected: Optional[HighestDiscountAnalysis] = Field(None, description="Product with highest discount")
    financial_impact: FinancialImpactAnalysis = Field(..., description="Estimated financial impact")

    model_config = ConfigDict(from_attributes=True)


# Recent Violations Schemas
class RecentViolationItem(BaseModel):
    """A single violation item in recent violations list."""
    id: UUID
    product_name: str = Field(..., description="Name of the product")
    marketplace: Optional[str] = Field(None, description="Marketplace where violation was found")
    vendor_name: Optional[str] = Field(None, description="Name of the vendor")
    current_price: float = Field(..., description="Current scraped price")
    target_msp: float = Field(..., description="Target Manufacturer Suggested Price")
    price_difference: Optional[float] = Field(None, description="Difference between MSP and scraped price")
    percentage_difference: Optional[float] = Field(None, description="Percentage difference between MSP and scraped price")
    status: str = Field(default="open", description="Status of violation: 'open' or 'notified'")
    violation_date: datetime = Field(..., description="Date when violation was detected")
    url: str = Field(..., description="URL where violation was found")

    model_config = ConfigDict(from_attributes=True)


class RecentViolationsPanel(BaseModel):
    """Recent violations section of dashboard."""
    recent_violations: List[RecentViolationItem] = Field(..., description="List of most recent violations (typically last N violations)")
    total_violations: int = Field(..., description="Total violations count")

    model_config = ConfigDict(from_attributes=True)


# Complete Dashboard Response
class DashboardResponse(BaseModel):
    """Complete dashboard response containing all sections."""
    kpi_summary: KPISummary = Field(..., description="KPI summary cards")
    violation_trend: ViolationTrendChart = Field(..., description="30-day violation trend chart")
    violation_analysis: ViolationAnalysis = Field(..., description="Violation analysis insights")
    recent_violations: RecentViolationsPanel = Field(..., description="Recent violations panel")
    last_refreshed_at: datetime = Field(..., description="Timestamp of last dashboard data refresh")

    model_config = ConfigDict(from_attributes=True)


# Refresh Request/Response
class DashboardRefreshRequest(BaseModel):
    """Request payload for dashboard refresh (can be empty)."""
    trigger_scraping: bool = Field(default=False, description="Whether to trigger scraping on refresh")

    model_config = ConfigDict(from_attributes=True)


class DashboardRefreshResponse(BaseModel):
    """Response for dashboard refresh."""
    message: str = Field(..., description="Status message")
    is_refreshing: bool = Field(..., description="Whether refresh is in progress")
    next_refresh_estimate: Optional[datetime] = Field(None, description="Estimated time for next data availability")

    model_config = ConfigDict(from_attributes=True)
