"""
Réseaux récemment rejoints, mémorisés localement pour éviter de ressaisir nom +
mot de passe à chaque connexion.

Le mot de passe est stocké en clair sur disque : même modèle de confiance que la clé
privée WireGuard persistée (wireguard_backend_common.load_or_create_keypair) — fichier
local protégé par les permissions utilisateur, pas de secret plus sensible que ça sur
cette machine.
"""

from __future__ import annotations

import json
import logging
from pathlib import Path

logger = logging.getLogger("meshamoto-client.recent_networks")

MAX_RECENT = 10


def load_recent_networks(path: Path) -> list[dict]:
    """Retourne la liste des réseaux récents (le plus récent en premier), ou [] si absente/corrompue."""
    if not path.exists():
        return []
    try:
        data = json.loads(path.read_text(encoding="utf-8"))
    except (OSError, json.JSONDecodeError):
        logger.warning("Impossible de lire %s, liste des réseaux récents ignorée", path)
        return []
    return data if isinstance(data, list) else []


def _write(path: Path, networks: list[dict]) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    path.write_text(json.dumps(networks, indent=2), encoding="utf-8")
    try:
        path.chmod(0o600)
    except OSError:
        pass


def save_recent_network(path: Path, name: str, password: str) -> None:
    """Ajoute (ou déplace en tête si déjà présent) ce réseau, borné à MAX_RECENT entrées."""
    networks = [n for n in load_recent_networks(path) if n.get("name") != name]
    networks.insert(0, {"name": name, "password": password})
    _write(path, networks[:MAX_RECENT])


def forget_network(path: Path, name: str) -> None:
    """Retire ce réseau de la liste des récents."""
    networks = [n for n in load_recent_networks(path) if n.get("name") != name]
    _write(path, networks)
