"""Lista los perfiles Chromium del catalogo osint_db con su numero de cuentas.

Wrapper cliente del service local `osint_db`: hace POST /api/query (read-only) con un
SELECT que une `browser_profiles` con el conteo agregado de `browser_profile_accounts`,
y mapea columns->rows a una lista de dicts.

Funcion impura: hace red (HTTP al service). No lanza; devuelve un dict de estado.
"""

from browser._osint_db_client import query, rows_to_dicts

# SELECT con LEFT JOIN al conteo agregado de cuentas por perfil. Columnas en orden fijo.
_SQL_BASE = (
    "SELECT p.profile_dir, p.label, p.persona, p.purpose, p.status, p.note_path, "
    "COALESCE(a.n_accounts, 0) AS n_accounts "
    "FROM browser_profiles p "
    "LEFT JOIN (SELECT profile_dir, COUNT(*) AS n_accounts "
    "FROM browser_profile_accounts GROUP BY profile_dir) a "
    "ON p.profile_dir = a.profile_dir"
)


def browser_profile_list(
    status: str | None = None,
    base_url: str = "http://127.0.0.1:8771",
) -> dict:
    """Lista los perfiles Chromium del catalogo con su numero de cuentas.

    Args:
        status: si no es None, filtra por estado del perfil (ej. "active", "archived").
            None -> devuelve todos los perfiles.
        base_url: base del service osint_db. Default http://127.0.0.1:8771.

    Returns:
        Caso ok: {"status":"ok", "profiles": list de dicts con claves
            profile_dir, label, persona, purpose, status, note_path, n_accounts}.
        Caso error (service caido o query rechazada): {"status":"error", "error": str}.
    """
    try:
        if status is None:
            sql = _SQL_BASE + " ORDER BY p.profile_dir"
            params: list = []
        else:
            sql = _SQL_BASE + " WHERE p.status = ? ORDER BY p.profile_dir"
            params = [status]

        resp = query(base_url, sql, params)
        if resp.get("status") != "ok":
            return {
                "status": "error",
                "error": resp.get("error", f"el service rechazo la query: {resp}"),
            }
        return {"status": "ok", "profiles": rows_to_dicts(resp)}
    except Exception as e:  # noqa: BLE001 - contrato: nunca lanzar
        return {"status": "error", "error": f"{type(e).__name__}: {e}"}


if __name__ == "__main__":
    # Smoke contra un puerto muerto: ejercita la degradacion graceful (service inaccesible).
    res = browser_profile_list(base_url="http://127.0.0.1:1")
    assert res["status"] == "error", res
    print("browser_profile_list smoke OK (service caido -> status error)")
    print(f"  {res}")
