"""Lista los vaults registrados en la app de escritorio Obsidian.

Lee el archivo de configuracion de la app (~/.config/obsidian/obsidian.json) y
devuelve las entradas de la clave "vaults". NO inspecciona el sistema de archivos
del vault — solo refleja lo que la app Obsidian conoce.

Funcion impura: lee un archivo del disco (la config de la app).
"""

import json
import os


def _default_config_path() -> str:
    """Ruta por defecto del obsidian.json de la app de escritorio Obsidian."""
    return os.path.expanduser("~/.config/obsidian/obsidian.json")


def _load_config(config_path: str) -> dict:
    """Carga obsidian.json. Si no existe devuelve la estructura vacia base."""
    if not os.path.exists(config_path):
        return {"vaults": {}}
    with open(config_path, "r", encoding="utf-8") as f:
        data = json.load(f)
    if not isinstance(data, dict):
        raise ValueError(f"obsidian config is not a JSON object: {config_path}")
    if "vaults" not in data or not isinstance(data.get("vaults"), dict):
        data["vaults"] = {}
    return data


def list_registered_obsidian_vaults(config_path: str = "") -> list:
    """Devuelve los vaults registrados en la app Obsidian, ordenados por path.

    Args:
        config_path: ruta al obsidian.json de la app. Vacio -> default
            ~/.config/obsidian/obsidian.json.

    Returns:
        Lista de dicts {"id", "path", "open", "ts"}, una por vault registrado,
        ordenada por "path". Lista vacia si el archivo no existe o no tiene vaults.

    Raises:
        ValueError: si el obsidian.json existente no es un objeto JSON valido.
        OSError: si la lectura del archivo falla por I/O.
    """
    cfg_path = config_path or _default_config_path()
    if not os.path.exists(cfg_path):
        return []

    data = _load_config(cfg_path)
    out = []
    for vid, entry in data["vaults"].items():
        if not isinstance(entry, dict):
            continue
        out.append(
            {
                "id": vid,
                "path": entry.get("path", ""),
                "open": entry.get("open", False),
                "ts": entry.get("ts", 0),
            }
        )
    out.sort(key=lambda e: e["path"])
    return out


if __name__ == "__main__":
    import tempfile
    import time

    tmp = tempfile.mkdtemp()
    cfg = os.path.join(tmp, "obsidian.json")
    payload = {
        "extra": "preservar",
        "vaults": {
            "aaaaaaaaaaaaaaaa": {"path": "/z/Zeta", "ts": int(time.time() * 1000), "open": True},
            "bbbbbbbbbbbbbbbb": {"path": "/a/Alpha", "ts": int(time.time() * 1000), "open": False},
        },
    }
    with open(cfg, "w", encoding="utf-8") as f:
        json.dump(payload, f)

    rows = list_registered_obsidian_vaults(config_path=cfg)
    assert [r["path"] for r in rows] == ["/a/Alpha", "/z/Zeta"], rows
    assert list_registered_obsidian_vaults(config_path=os.path.join(tmp, "nope.json")) == []
    print("list_registered_obsidian_vaults smoke OK")
