from datetime import date, datetime

from pydantic import BaseModel, ConfigDict, Field


class RawMaterialPriceVersionCreate(BaseModel):
    model_config = ConfigDict(extra="forbid")
    market_value: float = Field(gt=0)
    waste_percentage: float = Field(ge=0, default=0.0)
    effective_date: date
    status: str = "active"
    notes: str | None = Field(default=None, max_length=2000)


class RawMaterialPriceVersionRead(RawMaterialPriceVersionCreate):
    id: int
    created_at: datetime
    loss_cost: float
    cost_per_unit: float
    cost_per_kg: float
    model_config = ConfigDict(from_attributes=True)


class RawMaterialCreate(BaseModel):
    model_config = ConfigDict(extra="forbid")
    name: str = Field(min_length=1, max_length=255)
    supplier: str | None = Field(default=None, max_length=255)
    unit_of_measure: str = Field(min_length=1, max_length=64)
    kg_per_unit: float = Field(gt=0)
    status: str = "active"
    notes: str | None = Field(default=None, max_length=2000)
    initial_price: RawMaterialPriceVersionCreate


class RawMaterialUpdate(BaseModel):
    model_config = ConfigDict(extra="forbid")
    supplier: str | None = Field(default=None, max_length=255)
    unit_of_measure: str | None = Field(default=None, min_length=1, max_length=64)
    kg_per_unit: float | None = Field(default=None, gt=0)
    status: str | None = None
    notes: str | None = Field(default=None, max_length=2000)


class RawMaterialRead(BaseModel):
    id: int
    tenant_id: str
    name: str
    supplier: str | None
    unit_of_measure: str
    kg_per_unit: float
    status: str
    notes: str | None
    created_at: datetime
    current_price: RawMaterialPriceVersionRead | None
    model_config = ConfigDict(from_attributes=True)
