from typing import Optional, List, Dict, Any
from pydantic import BaseModel, EmailStr, Field, validator
from datetime import datetime


class EmailRequest(BaseModel):
    email: EmailStr = Field(..., description="User email address")


class UserUpdateRequest(BaseModel):
    first_name: Optional[str] = Field(None, max_length=50)
    last_name: Optional[str] = Field(None, max_length=50)
    username: Optional[str] = Field(None, max_length=50)
    avatar: Optional[Dict[str, Any]] = None
    # Profile fields
    bio: Optional[str] = None
    phone: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    country: Optional[str] = None
    website: Optional[str] = None
    social_links: Optional[Dict[str, str]] = None


class PasswordChangeRequest(BaseModel):
    email: EmailStr = Field(..., description="User email address")
    password: str = Field(..., min_length=8, description="New password")


class ForgotPasswordRequest(BaseModel):
    email: EmailStr = Field(..., description="User email address")
    username: Optional[str] = Field(None, description="Username (optional)")


class UserResponse(BaseModel):
    public_id: str
    username: Optional[str]
    email: str
    first_name: Optional[str]
    last_name: Optional[str]
    company_name: Optional[str]
    company_type: str
    is_verified: bool
    is_active: bool
    is_staff: bool
    is_admin: bool
    is_superuser: bool
    is_online: bool
    is_blocked: bool
    notif_enabled: bool
    last_login: Optional[datetime]
    date_joined: datetime
    last_seen_at: Optional[datetime]
    profile: Optional[Dict[str, Any]]
    role: Optional[Dict[str, Any]]


class MessageResponse(BaseModel):
    message: str
    status: Optional[int] = 200
    data: Optional[Any] = None


class ExistResponse(BaseModel):
    exists: bool


class StatsResponse(BaseModel):
    statsHorizontalWithDetails: List[Dict[str, Any]]


class ErrorResponse(BaseModel):
    error: str
    msg: str
    status: int = 500