"""
Énumération des adresses IPv4 locales sous Linux, via `ip -4 -o addr show`.

Non privilégié : `ip addr show` se lit sans root, contrairement à `ip addr add`.
Vérifié sur la machine de développement.
"""

from __future__ import annotations

import logging
import subprocess

import local_addresses_common as commun

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

# Court : cette énumération est sur le chemin de la connexion. Une machine dont
# `ip` traîne ne doit pas retarder le montage du tunnel — on préfère annoncer la
# seule adresse de la route par défaut, comme avant ce module.
_TIMEOUT_SECONDS = 3.0


def adresses_locales() -> list[str]:
    """
    Adresses IPv4 privées de cette machine, dans l'ordre du système.

    Liste vide en cas d'échec, jamais d'exception : l'appelant retombe alors sur
    la découverte historique par socket connecté. Une découverte incomplète
    dégrade la préférence LAN ; une exception empêcherait de se connecter.
    """
    try:
        resultat = subprocess.run(
            ["ip", "-4", "-o", "addr", "show", "scope", "global"],
            capture_output=True, text=True, timeout=_TIMEOUT_SECONDS, check=False,
        )
    except (OSError, subprocess.SubprocessError) as exc:
        logger.debug("Énumération des adresses locales impossible : %s", exc)
        return []
    if resultat.returncode != 0:
        logger.debug("`ip addr show` a renvoyé %s", resultat.returncode)
        return []
    return commun.filtrer_et_ordonner(commun.parser_ip_addr_linux(resultat.stdout))
