#!/usr/bin/env bash
# wg_install — Instala wireguard + wireguard-tools en Linux (debian/ubuntu/fedora/arch).
# Idempotente: si wg ya está instalado emite JSON con status=already-present y sale.
# Carga módulo kernel wireguard. Emite JSON a stdout. Logs a stderr con prefijo [wg_install].
# Exit 0 = éxito, 1 = fallo.

wg_install() {
    local distro="" version="" status=""

    _wg_log() { echo "[wg_install] $*" >&2; }

    # Detectar distro via /etc/os-release
    if [[ -f /etc/os-release ]]; then
        distro=$(. /etc/os-release && echo "${ID:-unknown}")
    else
        _wg_log "ERROR: /etc/os-release no encontrado; no se puede detectar distro"
        return 1
    fi

    _wg_log "Distro detectada: ${distro}"

    # Comprobar si wg ya está instalado (idempotencia)
    if command -v wg &>/dev/null; then
        version=$(wg --version 2>/dev/null | head -n1 || echo "unknown")
        _wg_log "wireguard-tools ya presente (${version}); cargando módulo kernel"
        # Intentar cargar módulo igualmente (no fatal)
        sudo modprobe wireguard 2>/dev/null || true
        printf '{"status":"already-present","distro":"%s","version":"%s"}\n' "${distro}" "${version}"
        return 0
    fi

    # Instalar según distro
    case "${distro}" in
        debian|ubuntu|linuxmint|pop|kali|raspbian)
            _wg_log "Usando apt-get (${distro})"
            sudo apt-get update -y >&2 || { _wg_log "ERROR: apt-get update falló"; return 1; }
            sudo apt-get install -y wireguard wireguard-tools >&2 \
                || { _wg_log "ERROR: apt-get install wireguard falló"; return 1; }
            ;;
        fedora)
            _wg_log "Usando dnf (fedora)"
            sudo dnf install -y wireguard-tools >&2 \
                || { _wg_log "ERROR: dnf install wireguard-tools falló"; return 1; }
            ;;
        rhel|centos|rocky|almalinux)
            _wg_log "Usando dnf (rhel/centos/rocky/alma)"
            sudo dnf install -y epel-release >&2 || true
            sudo dnf install -y wireguard-tools >&2 \
                || { _wg_log "ERROR: dnf install wireguard-tools falló"; return 1; }
            ;;
        arch|manjaro|endeavouros)
            _wg_log "Usando pacman (arch)"
            sudo pacman -S --noconfirm wireguard-tools >&2 \
                || { _wg_log "ERROR: pacman install wireguard-tools falló"; return 1; }
            ;;
        *)
            _wg_log "ERROR: distro '${distro}' no soportada (soportadas: debian/ubuntu/fedora/rhel/arch)"
            return 1
            ;;
    esac

    # Verificar instalación
    if ! command -v wg &>/dev/null; then
        _wg_log "ERROR: 'wg' no encontrado tras la instalación"
        return 1
    fi

    version=$(wg --version 2>/dev/null | head -n1 || echo "unknown")
    _wg_log "wireguard-tools instalado: ${version}"

    # Cargar módulo kernel (no fatal: kernels >=5.6 lo incluyen built-in)
    if sudo modprobe wireguard 2>/dev/null; then
        _wg_log "Módulo kernel wireguard cargado"
    else
        _wg_log "WARN: modprobe wireguard falló (puede estar built-in en el kernel o requerir DKMS)"
    fi

    status="installed"
    printf '{"status":"%s","distro":"%s","version":"%s"}\n' "${status}" "${distro}" "${version}"
    return 0
}
