"""
Énumération des adresses IPv4 locales sous Windows, via `Get-NetIPAddress`.

**PowerShell et JSON, pas `ipconfig`.** La règle du projet est de ne jamais
analyser ce qu'un outil Windows AFFICHE mais le format qu'il produit pour être
relu : l'affichage d'`ipconfig` est traduit (« Adresse IPv4 »), les noms de
propriétés PowerShell ne le sont pas. Quatrième application après `sc query`
(point 32), la sortie de `ping` (point 34) et `schtasks` (point 45).

Non privilégié : `Get-NetIPAddress` se lit sans élévation.
"""

from __future__ import annotations

import json
import logging
import subprocess

import local_addresses_common as commun

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

# Plus large que sous Linux : le démarrage de PowerShell coûte plusieurs
# centaines de millisecondes sur une machine chargée, et l'énumération est sur le
# chemin de la connexion.
_TIMEOUT_SECONDS = 10.0

# `Select-Object` réduit la sortie aux seules propriétés utiles : sans lui,
# `ConvertTo-Json` sérialise l'objet CIM entier, soit des dizaines de kilo-octets
# par interface.
_COMMANDE = (
    "Get-NetIPAddress -AddressFamily IPv4 | "
    "Select-Object -Property IPAddress,InterfaceIndex | ConvertTo-Json -Compress"
)


def adresses_locales() -> list[str]:
    """
    Adresses IPv4 privées de cette machine.

    Liste vide en cas d'échec, jamais d'exception — même contrat que le backend
    Linux, voir sa docstring.
    """
    try:
        resultat = subprocess.run(
            ["powershell", "-NoProfile", "-NonInteractive", "-Command", _COMMANDE],
            capture_output=True, text=True, timeout=_TIMEOUT_SECONDS, check=False,
            creationflags=getattr(subprocess, "CREATE_NO_WINDOW", 0),
        )
    except (OSError, subprocess.SubprocessError) as exc:
        logger.debug("Énumération des adresses locales impossible : %s", exc)
        return []
    if resultat.returncode != 0 or not resultat.stdout.strip():
        logger.debug("`Get-NetIPAddress` a renvoyé %s", resultat.returncode)
        return []
    try:
        charge = json.loads(resultat.stdout)
    except json.JSONDecodeError as exc:
        logger.debug("Sortie de Get-NetIPAddress illisible : %s", exc)
        return []
    return commun.filtrer_et_ordonner(commun.parser_get_netipaddress_json(charge))
