"""Setup inicial de Metabase via API."""

import httpx


def metabase_setup(
    base_url: str,
    admin_email: str,
    admin_password: str,
    admin_first_name: str = "Admin",
    admin_last_name: str = "User",
    site_name: str = "Metabase",
    site_locale: str = "en",
) -> dict:
    """Ejecuta el setup inicial de una instancia Metabase nueva.

    Usa el setup-token de una instancia sin configurar para crear el
    usuario admin y configurar preferencias del sitio. Solo funciona
    una vez — si Metabase ya tiene un usuario, retorna error.

    Endpoint: POST /api/setup (requiere setup-token valido).

    Args:
        base_url: URL base de la instancia (ej: "http://localhost:3000").
        admin_email: Email del usuario admin a crear.
        admin_password: Password del admin (min 8 chars con complejidad).
        admin_first_name: Nombre del admin.
        admin_last_name: Apellido del admin.
        site_name: Nombre del sitio Metabase.
        site_locale: Locale del sitio (ej: "es", "en").

    Returns:
        Dict con el session id del admin recien creado.

    Raises:
        httpx.HTTPStatusError: 400 si el setup-token es invalido o
            Metabase ya fue configurado.
        RuntimeError: Si no se puede obtener el setup-token.

    Example:
        >>> result = metabase_setup(
        ...     "http://localhost:3000",
        ...     "admin@example.com",
        ...     "SecurePass123!",
        ...     site_name="fn-registry",
        ...     site_locale="es",
        ... )
        >>> print(result["id"])  # session token
    """
    url = base_url.rstrip("/")

    # Obtener setup-token
    resp = httpx.get(f"{url}/api/session/properties")
    resp.raise_for_status()
    props = resp.json()
    setup_token = props.get("setup-token")
    if not setup_token:
        raise RuntimeError(
            "No setup-token disponible. Metabase ya fue configurado "
            "o has-user-setup es True."
        )

    # Ejecutar setup
    resp = httpx.post(
        f"{url}/api/setup",
        json={
            "token": setup_token,
            "user": {
                "first_name": admin_first_name,
                "last_name": admin_last_name,
                "email": admin_email,
                "password": admin_password,
            },
            "prefs": {
                "site_name": site_name,
                "site_locale": site_locale,
                "allow_tracking": False,
            },
        },
        timeout=30.0,
    )
    resp.raise_for_status()
    return resp.json()
