from pydantic import BaseModel, EmailStr, field_validator


# ── Requests ──────────────────────────────────────────────────────────────────

class SignupRequest(BaseModel):
    email: EmailStr
    motDePasse: str
    nom: str
    prenom: str
    bureauGenreId: str | None = None
    telephone: str | None = None
    filiere: str | None = None
    campus: str | None = None

    @field_validator("motDePasse")
    @classmethod
    def password_strength(cls, v: str) -> str:
        if len(v) < 6:
            raise ValueError("Le mot de passe doit contenir au moins 6 caractères")
        return v

    @field_validator("nom", "prenom", "telephone", "filiere", "campus")
    @classmethod
    def not_blank(cls, v: str | None) -> str | None:
        if v is not None and not v.strip():
            raise ValueError("Ce champ ne peut pas être vide")
        return v.strip() if v else v


class LoginRequest(BaseModel):
    email: EmailStr
    motDePasse: str
    appareil: str | None = None
    localisation: str | None = None


class RefreshRequest(BaseModel):
    refreshToken: str
    sessionId: str


class ForgotPasswordRequest(BaseModel):
    email: EmailStr


class ResetPasswordRequest(BaseModel):
    token: str
    nouveauMotDePasse: str

    @field_validator("nouveauMotDePasse")
    @classmethod
    def password_strength(cls, v: str) -> str:
        if len(v) < 6:
            raise ValueError("Le mot de passe doit contenir au moins 6 caractères")
        return v


# ── Responses ─────────────────────────────────────────────────────────────────

class LoginResponse(BaseModel):
    id: str
    token: str
    refreshToken: str
    sessionId: str
    email: str
    nom: str
    prenom: str
    typeUtilisateur: str
    expiresIn: int
    doitChangerMotDePasse: bool = False


class RefreshResponse(BaseModel):
    token: str
    refreshToken: str
    sessionId: str
    expiresIn: int


class ValidateTokenResponse(BaseModel):
    valid: bool
    id: str | None = None
    email: str | None = None
    nom: str | None = None
    prenom: str | None = None
    typeUtilisateur: str | None = None
    telephone: str | None = None
    filiere: str | None = None
    campus: str | None = None
    avatarUrl: str | None = None
