from pydantic import BaseModel, ConfigDict, EmailStr, field_validator
from typing import Optional


class ClientBase(BaseModel):
    cedula: Optional[str] = None
    full_name: Optional[str] = None
    email: Optional[EmailStr] = None
    phone: Optional[str] = None
    notes: Optional[str] = None

    @field_validator("cedula")
    @classmethod
    def validate_cedula(cls, value):
        if value is None:
            return value
        value = value.strip()
        if not value:
            return value
        if not value.isdigit():
            raise ValueError("La cédula solo debe contener números.")
        return value


class ClientCreate(ClientBase):
    cedula: str
    full_name: str


class ClientUpdate(BaseModel):
    cedula: Optional[str] = None
    full_name: Optional[str] = None
    email: Optional[EmailStr] = None
    phone: Optional[str] = None
    notes: Optional[str] = None

    @field_validator("cedula")
    @classmethod
    def validate_cedula(cls, value):
        if value is None:
            return value
        value = value.strip()
        if not value:
            return value
        if not value.isdigit():
            raise ValueError("La cédula solo debe contener números.")
        return value


class ClientOut(ClientBase):
    id: int
    model_config = ConfigDict(from_attributes=True)
