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

    model_config = ConfigDict(from_attributes=True)


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