"""CRUD de databases de Metabase."""

from .client import MetabaseClient


def metabase_list_databases(
    client: MetabaseClient,
    include_tables: bool = False,
) -> list:
    """Lista las databases configuradas en Metabase.

    Endpoint: GET /api/database.

    Args:
        client: Cliente autenticado.
        include_tables: Si True, incluye las tablas de cada database en la respuesta.

    Returns:
        Lista de dicts, cada uno con campos de la database:
        - id: ID numerico de la database
        - name: Nombre dado en Metabase
        - engine: Motor de BD (sqlite, postgres, mysql, etc.)
        - details: Dict con parametros de conexion
        - is_full_sync: Si sincroniza el schema automaticamente
        - tables: Lista de tablas (solo si include_tables=True)

    Example:
        >>> dbs = metabase_list_databases(client)
        >>> for db in dbs:
        ...     print(db["id"], db["name"], db["engine"])

        >>> dbs = metabase_list_databases(client, include_tables=True)
        >>> for db in dbs:
        ...     print(db["name"], [t["name"] for t in db.get("tables", [])])
    """
    params = {}
    if include_tables:
        params["include"] = "tables"
    result = client.request("GET", "/api/database", params=params)
    if isinstance(result, dict) and "data" in result:
        return result["data"]
    return result


def metabase_add_database(
    client: MetabaseClient,
    name: str,
    engine: str,
    details: dict,
) -> dict:
    """Agrega una nueva database a Metabase.

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

    Args:
        client: Cliente autenticado con permisos admin.
        name: Nombre descriptivo para la database en Metabase.
        engine: Motor de base de datos. Ejemplos: "sqlite", "postgres",
            "mysql", "h2", "mongo", "bigquery".
        details: Dict con parametros de conexion especificos del engine.
            Para SQLite: {"db": "/ruta/al/archivo.db"}
            Para Postgres: {"host": "...", "port": 5432, "dbname": "...",
                           "user": "...", "password": "..."}

    Returns:
        Dict con la database creada, incluyendo el campo "id" asignado
        por Metabase y todos los campos de configuracion.

    Raises:
        httpx.HTTPStatusError: 400 si los datos de conexion son invalidos.

    Example:
        >>> db = metabase_add_database(client, "Mi SQLite", "sqlite", {"db": "/data/ops.db"})
        >>> print(db["id"], db["name"])
    """
    body = {
        "name": name,
        "engine": engine,
        "details": details,
    }
    return client.request("POST", "/api/database", json=body)


def metabase_get_database(client: MetabaseClient, database_id: int) -> dict:
    """Obtiene los detalles de una database de Metabase por su ID.

    Endpoint: GET /api/database/:id.

    Args:
        client: Cliente autenticado.
        database_id: ID numerico de la database.

    Returns:
        Dict con campos de la database: id, name, engine, details,
        is_full_sync, is_on_demand, auto_run_queries, created_at,
        updated_at, features, etc.

    Raises:
        httpx.HTTPStatusError: 404 si la database no existe.

    Example:
        >>> db = metabase_get_database(client, 2)
        >>> print(db["name"], db["engine"])
    """
    return client.request("GET", f"/api/database/{database_id}")
