from datetime import datetime
from typing import Dict, Optional, List, Any
from uuid import UUID
from pydantic import BaseModel, Field, field_validator


# ----------- Wine Match Schemas -----------

class RetailerInfo(BaseModel):
    """Schema for retailer information in wine match payload"""
    code: str = Field(..., example="RET001")
    date: Optional[str] = Field(None, example="2025-07-15")
    
    @field_validator('date')
    @classmethod
    def validate_date_format(cls, v):
        if v:
            try:
                datetime.strptime(v, "%Y-%m-%d")
            except ValueError:
                raise ValueError("Date must be in YYYY-MM-DD format")
        return v


class WineMatchPayloadSchema(BaseModel):
    """Schema for the wine matching process payload"""
    retailers: Dict[str, RetailerInfo] = Field(
        ..., 
        description="Dictionary of retailers with their codes and dates",
        example={"retailer1": {"code": "RET001", "date": "2025-07-15"}}
    )
    matchedType: str = Field(..., example="KEYWORD", description="The type of matching to perform")
    mode: Optional[str] = Field(None, example="FULL", description="The operation mode")


class WineMatchBaseSchema(BaseModel):
    """Base schema for wine match"""
    name: str = Field(..., example="California Cabernet Match")
    description: Optional[str] = Field(None, example="Matching configuration for California Cabernet wines")


class WineMatchCreateSchema(WineMatchBaseSchema):
    """Schema for creating a wine match"""
    pass


class WineMatchUpdateSchema(BaseModel):
    """Schema for updating a wine match"""
    name: Optional[str] = Field(None, example="California Cabernet Match")
    description: Optional[str] = Field(None, example="Matching configuration for California Cabernet wines")


class WineMatchOutSchema(WineMatchBaseSchema):
    """Schema for wine match output"""
    id: int
    uuid: UUID
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True