"""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()