#!/bin/bash

# ==============================================================================
# Descripción: Automatiza la conexión a una red Wi-Fi específica (RyT-Wireless)
#              y soluciona problemas comunes de conectividad en sistemas Linux
#              que utilizan NetworkManager (nmcli) y Netplan.
# Autor: [Ian Moro e Google IA]
# Fecha: [22/10/25]
# Versión: 1.7
# ==============================================================================

# --- Configuración ---
readonly SSID="RyT-Wireless" # Nombre de la red WiFi a conectar

# --- Funciones de Utilidad ---

# Función para verificar si el script se ejecuta como root
check_root() {
  if [ "$(id -u)" -ne 0 ]; then
    echo "Error: Este script debe ejecutarse como root (sudo)." >&2
    exit 1
  fi
}

# Función para verificar si estamos conectados a la red WiFi deseada
# Retorna 0 si está conectado, 1 si no.
check_wifi_connection() {
  local current_ssid=$(iwgetid -r 2>/dev/null) # Redirige stderr a /dev/null
  if [ "$current_ssid" == "$SSID" ]; then
    return 0 # Conectado a la red deseada
  else
    return 1 # No estamos conectados a la red deseada
  fi
}

# Función para verificar la conexión a Internet
# Retorna 0 si hay conexión, 1 si no.
check_internet_connection() {
  ping -c 1 google.com &>/dev/null
  if [ $? -eq 0 ]; then
    return 0 # Hay conexión a Internet
  else
    return 1 # No hay conexión a Internet
  fi
}

# Función para encender el adaptador WiFi
turn_on_wifi() {
  echo "Encendiendo el adaptador WiFi..."
  nmcli radio wifi on
  sleep 4 # Esperar 4 segundos para que el WiFi se encienda
}

# Función para borrar los archivos de configuración de Netplan
clear_netplan_config() {
  echo "Borrando archivos de configuración de Netplan en /etc/netplan/..."
  rm -rf /etc/netplan/*
  sleep 3 # Esperar 3 segundos después de borrar la configuración
}

# Función para aplicar los cambios de Netplan
apply_netplan() {
  echo "Aplicando cambios de Netplan..."
  netplan apply
}

# Función para reiniciar el servicio NetworkManager
restart_network_manager() {
  echo "Reiniciando el servicio NetworkManager..."
  systemctl restart NetworkManager
  sleep 5 # Esperar 5 segundos después de reiniciar los servicios
}

# Función para intentar conectar a la red WiFi con reintentos
# Argumento 1: Mensaje a mostrar en cada intento.
# Retorna 0 si la conexión es exitosa, 1 si falla después de los reintentos.
attempt_wifi_connection() {
  local message_prefix="$1"
  local attempts=0
  local max_attempts=3
  local sleep_time=3

  while [ $attempts -lt $max_attempts ]; do
    echo "$message_prefix (Intento $((attempts + 1)) de $max_attempts)..."
    nmcli device wifi connect "$SSID" &>/dev/null # Conectar directamente
    sleep "$sleep_time"

    if check_wifi_connection; then
      echo "Éxito: Conectado a $SSID."
      return 0 # Conexión exitosa
    fi
    attempts=$((attempts + 1))
  done

  echo "Error: No se pudo conectar a $SSID después de $max_attempts intentos." >&2
  return 1 # Fallo en la conexión
}

# --- Lógica Principal del Script ---

# 1. Comprobar permisos de root
check_root

echo "Iniciando proceso de conexión y verificación de red para $SSID..."

# 2. Verificar conexión inicial a WiFi
if check_wifi_connection; then
  echo "Ya estás conectado a $SSID."
else
  echo "No estás conectado a $SSID o el WiFi está apagado."
  turn_on_wifi

  # Intentar conectar a la red RyT-Wireless
  if ! attempt_wifi_connection "Intentando conectar a $SSID"; then
    echo "Fallo inicial de conexión a $SSID. Procediendo con la reparación..."
  fi
fi

# 3. Verificar conexión a Internet después del primer intento/verificación
if check_internet_connection; then
  echo "¡Conexión a Internet exitosa!"
  exit 0
fi

echo "No se tiene acceso a Internet. Intentando reparar la configuración de red..."

# 4. Intentar reparar la configuración de Netplan
clear_netplan_config
apply_netplan

# Intentar conectar nuevamente después de la reparación de Netplan
if attempt_wifi_connection "Reintentando conexión a $SSID después de Netplan"; then
  if check_internet_connection; then
    echo "¡Conexión a Internet exitosa después de reparar Netplan!"
    exit 0
  else
    echo "Conectado a $SSID, pero aún sin acceso a Internet. Intentando reiniciar servicios..."
  fi
else
  echo "Fallo de conexión a $SSID después de reparar Netplan. Intentando reiniciar servicios..."
fi

# 5. Si aún no hay Internet, reiniciar el servicio NetworkManager
restart_network_manager

# Último intento de conexión después de reiniciar servicios
if attempt_wifi_connection "Último intento de conexión a $SSID"; then
  if check_internet_connection; then
    echo "¡Conexión a Internet exitosa después de reiniciar NetworkManager!"
    exit 0
  else
    echo "Conectado a $SSID, pero aún sin acceso a Internet. Por favor, revise su configuración manualmente." >&2
    exit 1
  fi
else
  echo "No se pudo conectar a $SSID después de reiniciar NetworkManager. Por favor, revise su conexión." >&2
  exit 1
fi
