from pydantic import BaseModel, EmailStr, Field, field_validator

from app.schemas.user import UserOut


class SignupRequest(BaseModel):
    email: EmailStr
    password: str = Field(min_length=8)
    confirm_password: str = Field(min_length=8)

    @field_validator("email", mode="before")
    @classmethod
    def _trim_email(cls, v):
        if isinstance(v, str):
            v = v.strip()
        return v


class LoginRequest(BaseModel):
    email: EmailStr
    password: str

    @field_validator("email", mode="before")
    @classmethod
    def _trim_email(cls, v):
        if isinstance(v, str):
            v = v.strip()
        return v


class TokenPair(BaseModel):
    access_token: str
    refresh_token: str
    token_type: str = "bearer"


class SignupResponse(BaseModel):
    user: UserOut
    tokens: TokenPair


class LoginResponse(BaseModel):
    tokens: TokenPair


class RefreshRequest(BaseModel):
    refresh_token: str


class RefreshResponse(BaseModel):
    tokens: TokenPair


class LogoutRequest(BaseModel):
    refresh_token: str


class MessageResponse(BaseModel):
    message: str


class ForgotPasswordRequest(BaseModel):
    email: EmailStr

    @field_validator("email", mode="before")
    @classmethod
    def _trim_email(cls, v: str):
        if v is None:
            return v
        if isinstance(v, str):
            v = v.strip()
            if not v:
                raise ValueError("Email is required")
        return v


class ForgotPasswordResponse(BaseModel):
    message: str


class ResetPasswordRequest(BaseModel):
    new_password: str = Field(min_length=8)
    confirm_password: str = Field(min_length=8)


class ResetPasswordResponse(BaseModel):
    message: str
