"""
DTOs para gestión de usuarios de Keycloak
"""

from datetime import datetime
from typing import List, Optional

from pydantic import BaseModel, EmailStr, Field, field_validator


class CreateUserRequestDTO(BaseModel):
    """Request para crear un nuevo usuario en Keycloak"""

    email: EmailStr = Field(..., description="Email del usuario")
    username: str = Field(
        ..., min_length=3, max_length=50, description="Nombre de usuario"
    )
    first_name: str = Field(..., min_length=1, max_length=100, description="Nombre")
    last_name: str = Field(..., min_length=1, max_length=100, description="Apellido")
    password: str = Field(..., min_length=8, description="Contraseña temporal")
    role: Optional[str] = Field(None, description="Rol del usuario en el tenant")
    enabled: bool = Field(True, description="Si el usuario está habilitado")
    email_verified: bool = Field(False, description="Si el email está verificado")


class UpdateUserRequestDTO(BaseModel):
    """Request para actualizar un usuario en Keycloak"""

    first_name: Optional[str] = Field(None, max_length=100)
    last_name: Optional[str] = Field(None, max_length=100)
    email: Optional[str] = Field(None, max_length=255)
    enabled: Optional[bool] = None
    email_verified: Optional[bool] = None
    role: Optional[str] = Field(None, description="Rol del usuario en el tenant actual")

    # Campos de perfil
    avatar_url: Optional[str] = Field(
        None, max_length=500, description="URL del avatar"
    )
    phone: Optional[str] = Field(None, max_length=20, description="Teléfono")
    bio: Optional[str] = Field(None, description="Biografía")
    preferences: Optional[dict] = Field(None, description="Preferencias del usuario")

    @field_validator("first_name", "last_name", "email")
    @classmethod
    def validate_non_empty_string(cls, v: Optional[str]) -> Optional[str]:
        """Valida que si el string está presente, no esté vacío"""
        if v is not None and v.strip() == "":
            return None  # Convertir strings vacíos a None
        return v


class UserResponseDTO(BaseModel):
    """Response con información de usuario de Keycloak"""

    id: str = Field(..., description="ID de Keycloak del usuario")
    username: str
    email: str = Field(default="", description="Email del usuario")
    first_name: str = Field(default="", description="Nombre del usuario")
    last_name: str = Field(default="", description="Apellido del usuario")
    enabled: bool
    email_verified: bool
    created_timestamp: Optional[int] = None
    role: Optional[str] = Field(None, description="Rol del usuario en el tenant actual")

    # Campos de perfil
    avatar_url: Optional[str] = Field(None, description="URL del avatar")
    phone: Optional[str] = Field(None, description="Teléfono")
    bio: Optional[str] = Field(None, description="Biografía")
    preferences: Optional[dict] = Field(
        default_factory=dict, description="Preferencias"
    )

    class Config:
        from_attributes = True


class UserListResponseDTO(BaseModel):
    """Response con lista de usuarios"""

    users: List[UserResponseDTO]
    total: int
    page: int
    page_size: int
    total_pages: int


class ChangePasswordRequestDTO(BaseModel):
    """Request para cambiar contraseña de un usuario"""

    password: str = Field(..., min_length=8, description="Nueva contraseña")
    temporary: bool = Field(
        True, description="Si es temporal (usuario debe cambiarla al login)"
    )


class UserStatsDTO(BaseModel):
    """Estadísticas de usuarios del tenant"""

    total_users: int
    active_users: int
    inactive_users: int
    max_users_allowed: int
    users_available: int
    usage_percentage: float
