from datetime import datetime
from typing import Optional, List
from pydantic import BaseModel, Field, field_validator, ConfigDict


class ProductBase(BaseModel):
    reference_id: int
    product_name: str = Field(..., min_length=3)
    barcode: str = Field(..., min_length=8, max_length=14)
    msp: float = Field(..., gt=0)
    status: bool = False

    @field_validator("barcode")
    @classmethod
    def validate_barcode(cls, v: str) -> str:
        if not v.isdigit():
            raise ValueError("Barcode must be numeric")
        return v

    @field_validator("product_name")
    @classmethod
    def validate_product_name(cls, v: str) -> str:
        if v.isdigit():
            raise ValueError("Product name cannot consist solely of numbers")
        return v


class ProductCreate(ProductBase):
    pass


class ProductUpdate(BaseModel):
    product_name: Optional[str] = Field(None, min_length=3)
    msp: Optional[float] = Field(None, gt=0)
    status: Optional[bool] = None

    @field_validator("product_name")
    @classmethod
    def validate_product_name(cls, v: Optional[str]) -> Optional[str]:
        if v is not None and v.isdigit():
            raise ValueError("Product name cannot consist solely of numbers")
        return v


class ProductResponse(ProductBase):
    id: int
    created_at: datetime
    updated_at: datetime
    last_execution_time: Optional[str] = None
    violation_count: int = 0

    # Include calculated pack prices in response
    price_1_pack: float
    price_2_pack: float
    price_3_pack: float
    price_4_pack: float
    price_5_pack: float
    price_6_pack: float
    price_12_pack: float

    model_config = ConfigDict(from_attributes=True)


class ProductListResponse(BaseModel):
    items: List[ProductResponse]
    total: int
    page: int
    limit: int


class BulkProductItem(ProductBase):
    """Schema for a single product item in bulk upload."""
    pass


class BulkProductUpload(BaseModel):
    """Schema for bulk product uploads from Excel/CSV files."""
    products: List[BulkProductItem] = Field(..., min_items=1, description="List of products to bulk upload")

    class Config:
        json_schema_extra = {
            "example": {
                "products": [
                    {
                        "reference_id": 15203,
                        "product_name": "COMPOSOR 3 HEPAVESICAL COMPLEX SXXI",
                        "barcode": "8422947152031",
                        "msp": 13.26,
                        "status": True
                    },
                    {
                        "reference_id": 15205,
                        "product_name": "COMPOSOR 5 SEDANER C",
                        "barcode": "8422947152055",
                        "msp": 17.45,
                        "status": True
                    }
                ]
            }
        }


class BulkUploadResponse(BaseModel):
    """Response from bulk upload operation."""
    total_processed: int
    successful: int
    failed: int
    skipped_duplicates: int
    errors: List[dict] = Field(default_factory=list, description="List of errors with row info")
    message: str
