"""CRUD de usuarios de Metabase."""

from .client import MetabaseClient


def metabase_list_users(
    client: MetabaseClient,
    status: str = "",
    query: str = "",
    limit: int = 0,
    offset: int = 0,
) -> dict:
    """Lista usuarios de Metabase con filtros opcionales.

    Endpoint: GET /api/user. Requiere permisos de superusuario.

    Args:
        client: Cliente autenticado.
        status: "active" (default), "deactivated" o "all".
        query: Filtro por nombre o email.
        limit: Tamanio de pagina (0 = default Metabase).
        offset: Offset para paginacion.

    Returns:
        Dict con estructura paginada:
        - data: lista de usuarios (id, email, first_name, last_name, is_superuser, etc.)
        - total: numero total de usuarios que coinciden
        - limit: tamanio de pagina usado
        - offset: offset usado

    Example:
        >>> users = metabase_list_users(client, status="active", query="john@")
        >>> for u in users["data"]:
        ...     print(u["email"], u["first_name"])
    """
    params = {}
    if status:
        params["status"] = status
    if query:
        params["query"] = query
    if limit > 0:
        params["limit"] = limit
    if offset > 0:
        params["offset"] = offset
    return client.request("GET", "/api/user", params=params)


def metabase_get_user(client: MetabaseClient, user_id: int) -> dict:
    """Obtiene un usuario de Metabase por su ID.

    Endpoint: GET /api/user/:id.

    Args:
        client: Cliente autenticado.
        user_id: ID numerico del usuario.

    Returns:
        Dict con datos del usuario: id, email, first_name, last_name,
        is_superuser, is_active, common_name, date_joined, last_login,
        group_ids, locale.

    Raises:
        httpx.HTTPStatusError: 404 si el usuario no existe.

    Example:
        >>> user = metabase_get_user(client, 1)
        >>> print(user["email"], user["is_superuser"])
    """
    return client.request("GET", f"/api/user/{user_id}")


def metabase_create_user(
    client: MetabaseClient,
    first_name: str,
    last_name: str,
    email: str,
    password: str = "",
    group_ids: list[int] | None = None,
) -> dict:
    """Crea un nuevo usuario en Metabase.

    Endpoint: POST /api/user. Requiere permisos de superusuario.

    Args:
        client: Cliente autenticado con permisos admin.
        first_name: Nombre del usuario.
        last_name: Apellido del usuario.
        email: Email unico del usuario.
        password: Password. Vacio = Metabase envia invitacion por email.
        group_ids: IDs de grupos a asignar. None = solo grupo default.

    Returns:
        Dict con el usuario creado (mismos campos que metabase_get_user).

    Raises:
        httpx.HTTPStatusError: 400 si el email ya existe.

    Example:
        >>> user = metabase_create_user(client, "John", "Doe", "john@example.com", "pass123")
        >>> print(user["id"])
    """
    body: dict = {
        "first_name": first_name,
        "last_name": last_name,
        "email": email,
    }
    if password:
        body["password"] = password
    if group_ids:
        body["group_ids"] = group_ids
    return client.request("POST", "/api/user", json=body)


def metabase_update_user(client: MetabaseClient, user_id: int, **fields) -> dict:
    """Actualiza campos de un usuario en Metabase.

    Endpoint: PUT /api/user/:id. Requiere permisos de superusuario.
    Solo se modifican los campos pasados como keyword arguments.

    Args:
        client: Cliente autenticado con permisos admin.
        user_id: ID del usuario a actualizar.
        **fields: Campos a actualizar. Validos:
            first_name (str), last_name (str), email (str),
            is_superuser (bool), group_ids (list[int]),
            locale (str), login_attributes (dict).

    Returns:
        Dict con el usuario actualizado.

    Example:
        >>> user = metabase_update_user(client, 5, first_name="Jane", is_superuser=True)
        >>> user = metabase_update_user(client, 5, group_ids=[1, 3, 5])
    """
    return client.request("PUT", f"/api/user/{user_id}", json=fields)


def metabase_deactivate_user(client: MetabaseClient, user_id: int) -> None:
    """Desactiva (soft-delete) un usuario en Metabase.

    Endpoint: DELETE /api/user/:id. Requiere permisos de superusuario.
    El usuario no se elimina permanentemente, solo se marca como inactivo.
    Para reactivar: PUT /api/user/:id/reactivate.

    Args:
        client: Cliente autenticado con permisos admin.
        user_id: ID del usuario a desactivar.

    Example:
        >>> metabase_deactivate_user(client, 5)
        >>> # Para ver desactivados: metabase_list_users(client, status="deactivated")
    """
    client.request("DELETE", f"/api/user/{user_id}")
