from __future__ import annotations

from typing import List, Optional, Union
from uuid import UUID
from datetime import datetime

from pydantic import BaseModel, EmailStr, Field, HttpUrl, validator, field_validator


class VendorBase(BaseModel):
    name: str = Field(..., min_length=3)
    brand_name: str = Field(...)
    email: EmailStr
    website_url: Optional[HttpUrl] = None
    is_active: bool = True

    @validator("email", pre=True)
    def strip_email(cls, v):
        if isinstance(v, str):
            return v.strip()
        return v

    @validator("website_url")
    def validate_website(cls, v):
        if v is None:
            return v
        text = str(v)
        if " " in text:
            raise ValueError("Website URL must not contain spaces")
        # AnyUrl/HttpUrl already enforces scheme, so no need for manual prefix check
        return v


class VendorCreate(VendorBase):
    pass


class VendorUpdate(BaseModel):
    name: Optional[str] = Field(None, min_length=3)
    brand_name: Optional[str]
    is_active: Optional[bool]


class VendorOut(BaseModel):
    id: UUID
    name: str
    brand_name: str
    email: EmailStr
    website_url: Optional[str] = None
    is_active: bool
    violation_count: int = 0
    average_discount: float = 0.0

    model_config = {"from_attributes": True}


class ViolationOut(BaseModel):
    id: UUID
    vendor_id: Optional[UUID] = None
    product_name: str
    barcode_number: Optional[str] = None
    reference_id: Optional[str] = None
    msp: float
    scraped_price: float
    price_difference: Optional[float] = None
    percentage_difference: Optional[float] = None
    violation_date: datetime
    url: str

    model_config = {"from_attributes": True}


class VendorDetailsOut(VendorOut):
    violations: List[ViolationOut]


class VendorListResponse(BaseModel):
    items: List[VendorOut]
    total: int
    page: int
    page_size: int


class ExportRequest(BaseModel):
    vendor_ids: Optional[Union[UUID, List[UUID]]] = None
    
    @field_validator("vendor_ids", mode="before")
    @classmethod
    def normalize_vendor_ids(cls, v):
        """Normalize single UUID to list for consistent processing."""
        if v is None:
            return None
        if isinstance(v, UUID):
            return [v]
        if isinstance(v, str):
            # Handle string UUID
            try:
                return [UUID(v)]
            except ValueError:
                raise ValueError("Invalid UUID format")
        if isinstance(v, list):
            # Convert any string UUIDs in list to UUID objects
            return [UUID(item) if isinstance(item, str) else item for item in v]
        raise ValueError("vendor_ids must be a UUID or list of UUIDs")


class ExportScrapingResultsRequest(BaseModel):
    vendor_id: Optional[UUID] = None
    product_id: Optional[int] = None
    status_filter: Optional[str] = None  # 'compliant', 'violation', 'complaining', 'unknown'


class ExportCombinedReportRequest(BaseModel):
    vendor_id: Optional[UUID] = None
    product_id: Optional[int] = None


class NotificationRequest(BaseModel):
    violation_ids: List[UUID]


class SendCustomNotificationRequest(BaseModel):
    violation_ids: List[UUID]
    recipient_email: EmailStr = Field(..., description="Recipient email address (REQUIRED - email will be sent to this address)")
    subject: Optional[str] = Field(
        None, 
        description="Email subject line (optional - uses default if not provided)"
    )
    message_body: Optional[str] = Field(
        None, 
        description="Email message body with template variables (optional - uses default template if not provided)"
    )
    
    model_config = {
        "json_schema_extra": {
            "example": {
                "violation_ids": ["550e8400-e29b-41d4-a716-446655440000"],
                "recipient_email": "admin@company.com",
                "subject": "Price Violation Notice – Immediate Attention Required",
                "message_body": "Dear {{VENDOR_NAME}},\n\nWe have identified a pricing violation...",
            }
        }
    }
