from typing import Optional
from uuid import UUID

from pydantic import BaseModel, Field, field_validator


_HEX_RE = r"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"


class PlotStatusResponse(BaseModel):
    id: UUID
    tenant_id: UUID
    name: str
    color_hex: str
    status_key: Optional[str] = None
    is_default: bool
    sort_order: int

    model_config = {"from_attributes": True}


class CreatePlotStatusRequest(BaseModel):
    name: str = Field(..., min_length=1, max_length=50)
    color_hex: str = Field(..., pattern=_HEX_RE)
    sort_order: int = 0

    @field_validator("name")
    @classmethod
    def _strip_name(cls, v: str) -> str:
        return v.strip()


class UpdatePlotStatusRequest(BaseModel):
    name: Optional[str] = Field(None, min_length=1, max_length=50)
    color_hex: Optional[str] = Field(None, pattern=_HEX_RE)
    sort_order: Optional[int] = None

    @field_validator("name")
    @classmethod
    def _strip_name(cls, v: Optional[str]) -> Optional[str]:
        return v.strip() if v is not None else v
