import re

from pydantic import BaseModel, ConfigDict, EmailStr, field_validator

# Accepts +, digits, spaces, dashes, parens, dots; 7-20 chars total (ASVS V5.1.3).
_PHONE_RE = re.compile(r"^\+?[\d\s\-().]{7,20}$")


class CreateCrewMemberRequest(BaseModel):
    # extra="forbid" blocks mass assignment of tenant_id / id / is_available etc.
    model_config = ConfigDict(extra="forbid")

    name: str
    email: EmailStr
    phone: str
    address: str

    @field_validator("name")
    @classmethod
    def validate_name(cls, v: str) -> str:
        v = v.strip()
        if not 1 <= len(v) <= 255:
            raise ValueError("Name must be between 1 and 255 characters")
        return v

    @field_validator("phone")
    @classmethod
    def validate_phone(cls, v: str) -> str:
        v = v.strip()
        if not _PHONE_RE.match(v):
            raise ValueError("Phone must be 7-20 characters (digits, spaces, +, -, (), .)")
        return v

    @field_validator("address")
    @classmethod
    def validate_address(cls, v: str) -> str:
        v = v.strip()
        if not 1 <= len(v) <= 500:
            raise ValueError("Address must be between 1 and 500 characters")
        return v


class UpdateCrewMemberRequest(CreateCrewMemberRequest):
    """Full update (PRD uses PUT) — identical field set and validation to create."""
