"""
Point d'entrée unique pour le "mode isolation" — masque la différence entre
Windows (netsh advfirewall) et Linux (nftables) derrière une API commune :

    enable_isolation(virtual_cidr: str, peer_acls: dict[str, list[int]] | None = None) -> None
    disable_isolation(peer_ips: list[str] | None = None) -> None

Rappel du comportement (voir les backends pour le détail d'implémentation) :
- Bloque les connexions ENTRANTES non sollicitées venant de tout ce qui n'est pas
  dans le réseau virtuel Meshamoto (virtual_cidr, ex: "25.0.0.0/8").
- N'affecte JAMAIS le trafic sortant : la navigation web et les connexions que TU
  inities continuent de fonctionner normalement.
- Modifie le pare-feu SYSTÈME (pas seulement l'adaptateur WireGuard) : c'est une
  protection globale de la machine tant que le mode est actif.
- `peer_acls` (optionnel, voir acl_rules.py) restreint les pairs listés à des ports
  précis plutôt qu'à tout le réseau virtuel — un pair absent de `peer_acls` garde
  l'accès complet (comportement historique, inchangé par défaut).

Second rôle, INDÉPENDANT du mode isolation :

    autoriser_application(virtual_cidr: str) -> bool
    blocages_applicatifs() -> list[dict]
    commande_retrait_a_suggerer(blocages: list[dict]) -> str

Autorise notre PROPRE exécutable à recevoir de l'entrant depuis le réseau virtuel,
et constate les règles de blocage qui viseraient ce même exécutable. Ça n'a rien à
voir avec l'isolation : c'est posé à chaque session, que le mode soit actif ou non,
pour que l'écho de vivacité (tunnel_probe) ne soit pas jeté par le pare-feu de la
machine. Voir le commentaire de section de firewall_backend_windows.py pour la
mesure qui a motivé ce chantier, et l'équivalent linuxien (`ufw` constaté, jamais
touché) dans firewall_backend_linux.py.
"""

from __future__ import annotations

import sys

if sys.platform == "win32":
    import firewall_backend_windows as _backend
elif sys.platform.startswith("linux"):
    import firewall_backend_linux as _backend
else:
    raise RuntimeError(
        f"Plateforme non supportée : {sys.platform}. "
        "Seuls Windows et Linux sont pris en charge par ce client."
    )


def enable_isolation(virtual_cidr: str, peer_acls: dict[str, list[int]] | None = None) -> None:
    _backend.enable_isolation(virtual_cidr, peer_acls)


def disable_isolation(peer_ips: list[str] | None = None) -> None:
    _backend.disable_isolation(peer_ips)


def autoriser_application(virtual_cidr: str) -> bool:
    return _backend.autoriser_application(virtual_cidr)


def blocages_applicatifs() -> list[dict]:
    return _backend.blocages_applicatifs()


def commande_retrait_a_suggerer(blocages: list[dict]) -> str:
    return _backend.commande_retrait_a_suggerer(blocages)
