"""
Mode réseau restreint — réglage local, mémorisé, **décoché par défaut**.

Coché, le client atteint le relais de secours par une WebSocket sur 443 au lieu de
l'UDP (voir ws_relay_transport). C'est le dernier recours pour un réseau qui bloque
totalement l'UDP : Wi-Fi d'hôtel, réseau d'entreprise, portail captif.

**MANUEL ET NON AUTOMATIQUE, et c'est une décision.** Le projet a mesuré trois fois que
ses replis automatiques se trompent (points 75, 76bis, 78) ; une bascule invisible vers
un porteur plus lent, qui rajoute du blocage de tête de file, contredirait en plus la
ligne « ne jamais laisser deviner ». L'utilisateur coche quand rien ne marche, et il
sait alors pourquoi son lien est différent.

**Cocher ne force rien.** Le réglage ne s'applique qu'aux pairs pour lesquels un relais
est DÉJÀ alloué : un chemin direct reste toujours préféré, sinon on paierait Python et
TCP là où l'UDP passe très bien.

Réglage purement local, sans coordination entre pairs — le porteur est asymétrique
(point 108b) : seul le pair bloqué s'en sert, l'autre continue en UDP sans rien savoir.
"""

from __future__ import annotations

import json
import logging
from pathlib import Path

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

CLE = "mode_reseau_restreint"


def charger_mode_restreint(path: Path, default: bool = False) -> bool:
    """
    Retourne le réglage mémorisé, ou `default` si le fichier est absent, illisible ou
    incohérent — un réglage corrompu ne doit jamais empêcher le client de démarrer,
    et **le défaut sûr est décoché** : au pire l'utilisateur reste sur le comportement
    éprouvé, alors qu'un défaut coché ferait passer tout le monde par TCP.
    """
    if not path.exists():
        return default
    try:
        data = json.loads(path.read_text(encoding="utf-8"))
        valeur = data[CLE]
        if not isinstance(valeur, bool):
            raise ValueError(valeur)
        return valeur
    except (OSError, json.JSONDecodeError, KeyError, ValueError, TypeError):
        logger.warning("Impossible de lire %s, mode réseau restreint ignoré", path)
        return default


def enregistrer_mode_restreint(path: Path, actif: bool) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    path.write_text(json.dumps({CLE: bool(actif)}), encoding="utf-8")
