"""
Pydantic schemas for API request/response validation.
"""
from pydantic import BaseModel
from datetime import datetime
from typing import Dict, List, Optional

class InvoiceResponse(BaseModel):
    """Schema for a single invoice response."""
    invoice_id: int
    branch_id: str
    company_id: int
    company_name: str
    date_issued: datetime
    total_ex_tax: float
    is_paid: bool
    stage: Optional[str] = None
    status: Optional[str] = None
    
    class Config:
        from_attributes = True


class DepartmentStats(BaseModel):
    """Schema for department monthly statistics."""
    name: str
    current: float  # Changed to float for precise revenue values
    breakeven: int
    target: int
    gross_profit_margin: Optional[float] = None  # GP margin percentage (0-100)
    gross_profit: Optional[float] = None  # GP in dollars
    gp_color: Optional[str] = None  # GP color indicator: "green", "yellow", or "red"
    gp_violations: Optional[int] = None  # Count of times GP was below threshold this month


class BranchMarketingStats(BaseModel):
    """Marketing numbers from KPI Seeder Marketing Numbers sheet (per branch)."""
    google_cost: float = 0.0
    google_clicks: int = 0
    google_leads: int = 0
    google_cost_per_lead: float = 0.0
    meta_cost: float = 0.0
    meta_clicks: int = 0
    meta_leads: int = 0
    meta_cost_per_lead: float = 0.0
    total_quote_value: float = 0.0
    total_sales_value: float = 0.0


class BranchDataResponse(BaseModel):
    """Schema for branch data with department statistics."""
    id: str
    name: str
    departments: List[DepartmentStats]
    gross_profit_margin: Optional[float] = None  # Overall branch GP margin percentage (0-100)
    gp_violations_total: Optional[int] = None  # Total GP violations across all departments
    marketing: Optional[BranchMarketingStats] = None  # From Marketing Numbers sheet
    # All locations' Google Business review totals (same on every branch payload; for Marketing tab).
    google_review_totals_by_branch: Optional[Dict[str, int]] = None


class OverviewResponse(BaseModel):
    """Schema for company-wide overview."""
    branches: List[BranchDataResponse]
    month: int
    year: int
    gross_profit_margin: Optional[float] = None  # Overall company GP margin percentage (0-100)
    overall_gp_color: Optional[str] = None  # GP color for overall margin: "green", "yellow", or "red"


class SyncStatusItem(BaseModel):
    """Schema for sync status of a single branch/company."""
    branch_id: str
    branch_name: str
    company_id: int
    company_name: str
    last_sync_timestamp: Optional[datetime] = None
    last_sync_date: Optional[datetime] = None
    invoice_count: int


class SyncStatusResponse(BaseModel):
    """Schema for overall sync status."""
    total_invoices: int
    branches: List[SyncStatusItem]
    last_sync_run: Optional[datetime] = None

