from typing import Optional
from uuid import UUID

from pydantic import BaseModel, Field, field_validator


class CreatePlotGroupRequest(BaseModel):
    plot_ids: list[UUID] = Field(..., min_length=2, max_length=50)
    group_type: str = Field("custom", max_length=20)
    label: Optional[str] = Field(None, max_length=255)
    capacity: Optional[int] = Field(None, ge=1, le=50)

    @field_validator("group_type")
    @classmethod
    def _valid_type(cls, v: str) -> str:
        allowed = {"couple", "family", "custom"}
        if v not in allowed:
            raise ValueError(f"group_type must be one of {sorted(allowed)}")
        return v

    @field_validator("plot_ids")
    @classmethod
    def _unique_ids(cls, v: list[UUID]) -> list[UUID]:
        if len(set(v)) != len(v):
            raise ValueError("plot_ids must be unique")
        return v


class PlotGroupResponse(BaseModel):
    id: UUID
    tenant_id: UUID
    section_id: Optional[UUID] = None
    group_type: str
    label: Optional[str] = None
    capacity: int
    plot_ids: list[UUID] = []
    boundary: Optional[dict] = None

    model_config = {"from_attributes": True}
