from datetime import datetime
from uuid import UUID

from pydantic import BaseModel, ConfigDict, EmailStr, Field


class SignupRequest(BaseModel):
    full_name: str = Field(
        min_length=2,
        max_length=150,
    )
    email: EmailStr
    password: str = Field(
        min_length=8,
        max_length=128,
    )
    platform_invite_token: str | None = Field(default=None, min_length=32, max_length=255)

class AcceptPlatformStaffInvitationRequest(BaseModel):
    platform_invite_token: str = Field(min_length=32, max_length=255)


class LoginRequest(BaseModel):
    email: EmailStr
    password: str = Field(
        min_length=8,
        max_length=128,
    )


class VerifyEmailRequest(BaseModel):
    email: EmailStr
    code: str = Field(
        min_length=6,
        max_length=6,
        pattern=r"^\d{6}$",
    )


class ResendVerificationRequest(BaseModel):
    email: EmailStr


class ForgotPasswordRequest(BaseModel):
    email: EmailStr


class ResetPasswordRequest(BaseModel):
    email: EmailStr
    token: str = Field(
        min_length=20,
        max_length=255,
    )
    new_password: str = Field(
        min_length=8,
        max_length=128,
    )


class UserResponse(BaseModel):
    id: UUID
    full_name: str | None
    email: EmailStr
    is_active: bool
    is_email_verified: bool
    is_platform_admin: bool
    created_at: datetime

    model_config = ConfigDict(
        from_attributes=True,
    )


class LoginResponse(BaseModel):
    access_token: str
    token_type: str = "bearer"
    user: UserResponse


class MessageResponse(BaseModel):
    message: str
