#!/bin/bash

if [ -n "$SUDO_USER" ]; then
  source /home/$SUDO_USER/.index.sh
else
  source $HOME/.index.sh
fi

pathmount="/tmp/pathmount"
YAML_FILE="/srv/system.yaml"

function start {
  if ! var0=$(dialog --title 'Ferramentas' --backtitle "Ferramentas e Utilidades" --ok-label "Acessar" --cancel-label "Voltar" --menu " " 0 0 0 \
  0 'Buscar Pastas ou Arquivos' \
  1 'Instalar o DWService' \
  2 'Baixar Imagens .ISO (XPRA)' \
  3 'Atualizar Driver VirtIO (XPRA)' \
  4 'Testar o Beep' \
  5 'Sync SATAs' \
  6 'Ping DNS (para pfSense)' \
  7 'SpeedTest by Ookla' \
  8 'Teste iperf de Velocidade LAN' \
  9 'Alterar Hostname do Servidor' \
  10 'Ver Erros das Placas de Rede' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi
  case "$var0" in
  0) curl -sSL --connect-timeout 5 --max-time 0 --retry 3 --retry-delay 2  $link118 | tee /tmp/search-tool.sh> /dev/null ; clear; sudo bash /tmp/search-tool.sh ; start ;;
  1) dwservice0 ; start ;;
  2) clear ; curl -sSL --connect-timeout 5 --max-time 0 --retry 3 --retry-delay 2  $link115 | sudo bash ; start ;;
  3) clear; curl -sSL --connect-timeout 5 --max-time 0 --retry 3 --retry-delay 2  https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso | sudo tee /var/lib/libvirt/images/virtio-win.iso> /dev/null ; start ;;
  4) clear ; sudo env -u SUDO_GID -u SUDO_COMMAND -u SUDO_USER -u SUDO_UID beep ; start ;;
  5) clear ; satas ; start ;;
  6) clear ; dnstest ; start ;;
  7) speedtest0 ; start ;;
  8) iperftest ; start ;;
  9) hostname_menu_with_yaml ; start ;;
  10) clear ; check_network_drops ; start ;;
  X) echo "." >/dev/null ;;
  esac
}

check_network_drops() {
    echo "=== Verificando perdas de pacotes nas interfaces ==="
    echo ""
    
    # Pegar interfaces do netplan (exceto lo, docker, veth, virbr)
    interfaces=$(ip -o link show | awk -F': ' '{print $2}' | grep -E '^(en|eth|wlan)' | grep -v '@')
    
    for iface in $interfaces; do
        echo "=== Interface: $iface ==="
        ip -s link show "$iface"
        echo ""
        
        # Extrair valores de RX e TX dropped
        rx_dropped=$(ip -s link show "$iface" | grep -A1 "RX:" | tail -1 | awk '{print $4}')
        tx_dropped=$(ip -s link show "$iface" | grep -A1 "TX:" | tail -1 | awk '{print $4}')
        
        # Verificar se há drops
        if [ "$rx_dropped" -gt 0 ] 2>/dev/null || [ "$tx_dropped" -gt 0 ] 2>/dev/null; then
            echo "⚠️  ERROR: TEMOS PERDAS DE PACOTES"
            [ "$rx_dropped" -gt 0 ] 2>/dev/null && echo "    RX DROPPED: $rx_dropped"
            [ "$tx_dropped" -gt 0 ] 2>/dev/null && echo "    TX DROPPED: $tx_dropped"
        else
            echo "✓ Sem perdas de pacotes"
        fi
        
        echo ""
        echo "---"
        echo ""
    done

    sleep 5
}

# Função para salvar hostname no system.yaml
function save_hostname_to_yaml {
  local hostname="$1"
  local datetime=$(date +"%d/%m/%Y - %H:%M:%S")
  
  echo "💾 Salvando hostname no system.yaml..."
  
  # Verifica se o arquivo existe, se não, cria estrutura básica
  if [ ! -f "$YAML_FILE" ]; then
    clear; echo "PADRÃO CDN INEXISTENTE! Saindo."; sleep 5
    return
  else
    # Arquivo existe, apenas atualiza a seção Sistema
    echo "📝 Atualizando hostname no system.yaml..."
    
    # Verifica se a seção Sistema existe
    if ! yq -e '.Sistema' "$YAML_FILE" >/dev/null 2>&1; then
      sudo yq -i '.Sistema = {}' "$YAML_FILE"
    fi
    
    # Atualiza hostname e data
    sudo yq -i ".Sistema.Hostname = \"$hostname\"" "$YAML_FILE"
    sudo yq -i ".Sistema.Data_Hostname = \"$datetime\"" "$YAML_FILE"
  fi
  
  echo "✅ Hostname '$hostname' salvo no system.yaml!"
}

# Função para obter hostname do system.yaml
function get_hostname_from_yaml {
  if [ ! -f "$YAML_FILE" ]; then
    echo ""
    return 1
  fi
  
  hostname_from_yaml=$(yq -r '.Sistema.Hostname // empty' "$YAML_FILE" 2>/dev/null)
  echo "$hostname_from_yaml"
}

# Função para verificar se hostname no sistema difere do YAML
function check_hostname_sync {
  local current_hostname=$(hostname)
  local yaml_hostname=$(get_hostname_from_yaml)
  
  if [ -z "$yaml_hostname" ]; then
    echo "⚠️  Hostname não definido no system.yaml"
    return 1
  elif [ "$current_hostname" != "$yaml_hostname" ]; then
    echo "⚠️  Hostname desatualizado:"
    echo "   Sistema atual: $current_hostname"
    echo "   No system.yaml: $yaml_hostname"
    return 2
  else
    echo "✅ Hostname sincronizado: $current_hostname"
    return 0
  fi
}

# Função modificada para alterar hostname (com salvamento no YAML)
function change_hostname_with_yaml {
  # Captura o hostname atual
  current_hostname=$(hostname)
  current_fqdn=$(hostname -f 2>/dev/null || echo "$current_hostname")
  
  # Exibe informações atuais
  dialog --title "Hostname Atual" --msgbox "Hostname atual: $current_hostname\nFQDN atual: $current_fqdn" 8 50
  
  # Solicita o novo hostname
  if ! new_hostname=$(dialog --title "Alterar Hostname" --backtitle "Configuração de Sistema" --inputbox "Digite o novo hostname:\n\nRegras:\n- Apenas letras, números e hífens\n- Máximo 63 caracteres\n- Não pode começar ou terminar com hífen" 12 50 "$current_hostname" 2>&1 > /dev/tty); then
    return
  fi
  
  # Validação básica do hostname
  if [ -z "$new_hostname" ]; then
    dialog --title "ERRO" --msgbox "O hostname não pode estar vazio!" 6 40
    return
  fi
  
  # Verifica se o hostname contém apenas caracteres válidos
  if ! echo "$new_hostname" | grep -q '^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$\|^[a-zA-Z0-9]$'; then
    dialog --title "ERRO" --msgbox "Hostname inválido!\n\nUse apenas:\n- Letras (a-z, A-Z)\n- Números (0-9)\n- Hífens (-)\n\nNão pode começar ou terminar com hífen." 10 50
    return
  fi
  
  # Verifica o comprimento
  if [ ${#new_hostname} -gt 63 ]; then
    dialog --title "ERRO" --msgbox "Hostname muito longo!\nMáximo: 63 caracteres\nAtual: ${#new_hostname} caracteres" 8 40
    return
  fi
  
  # Confirmação
  if ! dialog --title "Confirmação" --backtitle "Alteração de Hostname" --yesno "Alterar hostname de:\n'$current_hostname'\npara:\n'$new_hostname'\n\nSalvar no system.yaml?\n\nTem certeza?" 12 50; then
    dialog --title "Cancelado" --msgbox "Alteração cancelada pelo usuário." 6 40
    return
  fi
  
  # Executa as alterações
  change_hostname_execute_with_yaml "$new_hostname"
}

# Função para executar a alteração do hostname (com salvamento no YAML)
function change_hostname_execute_with_yaml {
  local new_hostname="$1"
  local current_hostname=$(hostname)
  local temp_file="/tmp/hosts_backup_$(date +%s)"
  
  # Backup do /etc/hosts
  if ! sudo cp /etc/hosts "$temp_file"; then
    dialog --title "ERRO" --msgbox "Falha ao criar backup do /etc/hosts!" 6 40
    return
  fi
  
  dialog --title "Processando" --infobox "Alterando hostname...\nPor favor, aguarde..." 5 30
  
  # 1. Altera via hostnamectl
  if ! sudo hostnamectl set-hostname "$new_hostname"; then
    dialog --title "ERRO" --msgbox "Falha ao definir hostname via hostnamectl!" 6 40
    return
  fi
  
  # 2. Atualiza /etc/hosts
  # Remove entradas antigas do hostname
  sudo sed -i "/$current_hostname/d" /etc/hosts
  
  # Adiciona novas entradas
  if ! grep -q "127.0.0.1.*$new_hostname" /etc/hosts; then
    sudo sed -i "1a\\127.0.0.1\t$new_hostname" /etc/hosts
  fi
  
  if ! grep -q "127.0.1.1.*$new_hostname" /etc/hosts; then
    sudo sed -i "/127.0.0.1.*$new_hostname/a\\127.0.1.1\t$new_hostname" /etc/hosts
  fi
  
  # 3. Atualiza /etc/hostname (backup method)
  echo "$new_hostname" | sudo tee /etc/hostname > /dev/null
  
  # 4. NOVO: Salva no system.yaml
  save_hostname_to_yaml "$new_hostname"
  
  sleep 1
  
  # Verifica se a alteração foi bem-sucedida
  local verification_hostname=$(hostnamectl --static)
  
  if [ "$verification_hostname" = "$new_hostname" ]; then
    dialog --title "Sucesso" --msgbox "Hostname alterado com sucesso!\n\nAnterior: $current_hostname\nNovo: $new_hostname\n\n✅ Sistema atualizado\n✅ Salvo no system.yaml\n\nBackup do /etc/hosts salvo em:\n$temp_file\n\nReinicie o sistema para garantir que todas as aplicações reconheçam a mudança." 15 60
  else
    # Restaura backup em caso de falha
    sudo cp "$temp_file" /etc/hosts
    dialog --title "ERRO" --msgbox "Falha na alteração do hostname!\n\nO /etc/hosts foi restaurado do backup.\nVerifique as permissões e tente novamente." 8 50
  fi
}

# Função para aplicar hostname do system.yaml ao sistema
function apply_hostname_from_yaml {
  local yaml_hostname=$(get_hostname_from_yaml)
  local current_hostname=$(hostname)
  
  if [ -z "$yaml_hostname" ]; then
    dialog --title "ERRO" --msgbox "Nenhum hostname encontrado no system.yaml!\n\nDefina um hostname primeiro usando a opção 'Alterar hostname'." 8 50
    return
  fi
  
  if [ "$current_hostname" = "$yaml_hostname" ]; then
    dialog --title "Informação" --msgbox "O hostname do sistema já está sincronizado!\n\nHostname atual: $current_hostname\nHostname no YAML: $yaml_hostname" 8 50
    return
  fi
  
  # Mostra informações e pede confirmação
  if ! dialog --title "Aplicar Hostname do YAML" --backtitle "Sincronização de Hostname" --yesno "Aplicar hostname do system.yaml?\n\nHostname atual: $current_hostname\nHostname no YAML: $yaml_hostname\n\nIsto irá alterar o hostname do sistema.\n\nContinuar?" 12 50; then
    dialog --title "Cancelado" --msgbox "Operação cancelada pelo usuário." 6 40
    return
  fi
  
  # Aplica o hostname do YAML
  apply_hostname_execute "$yaml_hostname"
}

# Função para executar aplicação do hostname do YAML
function apply_hostname_execute {
  local new_hostname="$1"
  local current_hostname=$(hostname)
  local temp_file="/tmp/hosts_backup_$(date +%s)"
  local datetime=$(date +"%d/%m/%Y - %H:%M:%S")
  
  # Backup do /etc/hosts
  if ! sudo cp /etc/hosts "$temp_file"; then
    dialog --title "ERRO" --msgbox "Falha ao criar backup do /etc/hosts!" 6 40
    return
  fi
  
  dialog --title "Processando" --infobox "Aplicando hostname do YAML...\nPor favor, aguarde..." 5 40
  
  # 1. Altera via hostnamectl
  if ! sudo hostnamectl set-hostname "$new_hostname"; then
    dialog --title "ERRO" --msgbox "Falha ao definir hostname via hostnamectl!" 6 40
    return
  fi
  
  # 2. Atualiza /etc/hosts
  # Remove entradas antigas do hostname
  sudo sed -i "/$current_hostname/d" /etc/hosts
  
  # Adiciona novas entradas
  if ! grep -q "127.0.0.1.*$new_hostname" /etc/hosts; then
    sudo sed -i "1a\\127.0.0.1\t$new_hostname" /etc/hosts
  fi
  
  if ! grep -q "127.0.1.1.*$new_hostname" /etc/hosts; then
    sudo sed -i "/127.0.0.1.*$new_hostname/a\\127.0.1.1\t$new_hostname" /etc/hosts
  fi
  
  # 3. Atualiza /etc/hostname
  echo "$new_hostname" | sudo tee /etc/hostname > /dev/null
  
  # 4. Atualiza data de aplicação no YAML
  if [ -f "$YAML_FILE" ]; then
    sudo yq -i ".Sistema.Data_Aplicacao = \"$datetime\"" "$YAML_FILE"
  fi
  
  sleep 1
  
  # Verifica se a alteração foi bem-sucedida
  local verification_hostname=$(hostnamectl --static)
  
  if [ "$verification_hostname" = "$new_hostname" ]; then
    dialog --title "Sucesso" --msgbox "Hostname aplicado com sucesso!\n\nAnterior: $current_hostname\nNovo: $new_hostname\n\n✅ Hostname do YAML aplicado\n✅ Data de aplicação atualizada\n\nBackup do /etc/hosts salvo em:\n$temp_file\n\nReinicie o sistema para garantir que todas as aplicações reconheçam a mudança." 16 60
  else
    # Restaura backup em caso de falha
    sudo cp "$temp_file" /etc/hosts
    dialog --title "ERRO" --msgbox "Falha na aplicação do hostname!\n\nO /etc/hosts foi restaurado do backup.\nVerifique as permissões e tente novamente." 8 50
  fi
}

# Função para mostrar informações detalhadas do hostname (incluindo YAML)
function show_hostname_info_with_yaml {
  local current_hostname=$(hostname)
  local static_hostname=$(hostnamectl --static)
  local pretty_hostname=$(hostnamectl --pretty 2>/dev/null || echo "Não definido")
  local transient_hostname=$(hostnamectl --transient)
  local fqdn=$(hostname -f 2>/dev/null || echo "Não disponível")
  local domain=$(hostname -d 2>/dev/null || echo "Não definido")
  
  # Informações do YAML
  local yaml_hostname=$(get_hostname_from_yaml)
  local yaml_info=""
  
  if [ -n "$yaml_hostname" ]; then
    local yaml_date=$(yq -r '.Sistema.Data_Hostname // "Não disponível"' "$YAML_FILE" 2>/dev/null)
    local yaml_applied=$(yq -r '.Sistema.Data_Aplicacao // "Nunca aplicado"' "$YAML_FILE" 2>/dev/null)
    
    yaml_info="
INFORMAÇÕES DO SYSTEM.YAML:
Hostname salvo: $yaml_hostname
Data de definição: $yaml_date
Última aplicação: $yaml_applied"
    
    if [ "$current_hostname" != "$yaml_hostname" ]; then
      yaml_info="$yaml_info
⚠️  STATUS: Desatualizado!"
    else
      yaml_info="$yaml_info
✅ STATUS: Sincronizado"
    fi
  else
    yaml_info="
INFORMAÇÕES DO SYSTEM.YAML:
❌ Hostname não definido no YAML"
  fi
  
  # Captura conteúdo relevante do /etc/hosts
  local hosts_content=$(grep -E "(127\.0\.0\.1|127\.0\.1\.1)" /etc/hosts | head -5)
  
  dialog --title "Informações Completas do Hostname" --msgbox "INFORMAÇÕES DO SISTEMA:
Hostname atual: $current_hostname
Hostname estático: $static_hostname  
Hostname transiente: $transient_hostname
Hostname pretty: $pretty_hostname
FQDN: $fqdn
Domínio: $domain
$yaml_info

ENTRADAS EM /etc/hosts:
$hosts_content" 20 80
}

# Menu principal para hostname (modificado)
function hostname_menu_with_yaml {
  while true; do
    # Verifica status de sincronização para mostrar no menu
    local sync_status=""
    case $(check_hostname_sync >/dev/null 2>&1; echo $?) in
      1) sync_status=" [❌ Não definido no YAML]" ;;
      2) sync_status=" [⚠️ Desatualizado]" ;;
      0) sync_status=" [✅ Sincronizado]" ;;
    esac
    
    if ! var0=$(dialog --title "Gerenciamento de Hostname${sync_status}" --backtitle "Configurações do Sistema" --menu "Selecione uma opção:" 0 0 0 \
      1 'Visualizar informações completas do hostname' \
      2 'Alterar hostname (salva no YAML)' \
      3 'Aplicar hostname do system.yaml ao sistema' \
      4 'Verificar sincronização YAML ↔ Sistema' \
      5 'Verificar arquivo /etc/hosts' \
      6 'Testar resolução de nome' \
      X 'Voltar' 2>&1 > /dev/tty); then
      return
    fi
    
    case "$var0" in
    1) show_hostname_info_with_yaml ;;
    2) change_hostname_with_yaml ;;
    3) apply_hostname_from_yaml ;;
    4) check_hostname_sync_dialog ;;
    5) show_hosts_file ;;
    6) test_hostname_resolution ;;
    X) return ;;
    esac
  done
}

# Função para exibir status de sincronização em dialog
function check_hostname_sync_dialog {
  local current_hostname=$(hostname)
  local yaml_hostname=$(get_hostname_from_yaml)
  local message=""
  
  if [ -z "$yaml_hostname" ]; then
    message="STATUS: Hostname não definido no system.yaml
    
Hostname atual do sistema: $current_hostname
Hostname no system.yaml: Não definido

RECOMENDAÇÃO:
Use a opção 'Alterar hostname' para definir e salvar no YAML."
  elif [ "$current_hostname" != "$yaml_hostname" ]; then
    message="STATUS: Hostname desatualizado
    
Hostname atual do sistema: $current_hostname
Hostname no system.yaml: $yaml_hostname

RECOMENDAÇÃO:
Use 'Aplicar hostname do system.yaml' para sincronizar o sistema com o YAML."
  else
    local yaml_date=$(yq -r '.Sistema.Data_Hostname // "Não disponível"' "$YAML_FILE" 2>/dev/null)
    message="STATUS: Hostname sincronizado ✅
    
Hostname atual: $current_hostname
Definido no YAML em: $yaml_date

Tudo está correto!"
  fi
  
  dialog --title "Status de Sincronização" --msgbox "$message" 12 60
}

# Função para mostrar o arquivo /etc/hosts
function show_hosts_file {
  local hosts_content=$(cat /etc/hosts)
  dialog --title "Conteúdo do /etc/hosts" --msgbox "$hosts_content" 20 80
}

# Função para testar resolução de nome
function test_hostname_resolution {
  local current_hostname=$(hostname)
  local test_results=""
  
  dialog --title "Testando" --infobox "Testando resolução de nomes...\nPor favor, aguarde..." 5 40
  
  # Testa resolução local
  if ping -c 1 "$current_hostname" >/dev/null 2>&1; then
    test_results="✅ Resolução local: OK\n"
  else
    test_results="❌ Resolução local: FALHA\n"
  fi
  
  # Testa resolução localhost
  if ping -c 1 localhost >/dev/null 2>&1; then
    test_results="${test_results}✅ Localhost: OK\n"
  else
    test_results="${test_results}❌ Localhost: FALHA\n"
  fi
  
  # Testa resolução DNS externa
  if ping -c 1 google.com >/dev/null 2>&1; then
    test_results="${test_results}✅ DNS externo: OK\n"
  else
    test_results="${test_results}❌ DNS externo: FALHA\n"
  fi
  
  # Mostra resultados
  dialog --title "Resultados do Teste" --msgbox "Resultados da resolução de nomes:\n\n$test_results\nHostname testado: $current_hostname" 10 50
}

function speedtest0 {
  clear
  echo ""; echo "Aguarde a conclusao do teste!"; echo ""
  curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python3
  echo ""; sleep 3
  read -r -p "Teste concluido! Pressione Enter para fechar"
}

function iperftest {
  if var0=$(dialog --title 'iperf' --backtitle "" --menu "Escolha o modo!" 0 0 0 \
  1 'Cliente' \
  2 'Servidor' \
  X '<' 2>&1 > /dev/tty ); then
    return
  fi
  
  case "$var0" in
  1) iperfclnt ; start ;;
  2) iperfsrv ; start ;;
  X) echo "." > /dev/null ;;
  esac
}

function iperfclnt {
  clear; echo ""
  read -r -a ipcc -p "Digite o IP do Servidor: "
  clear; echo "Entrando no modo Cliente. Para sair antes do teste concluir, tecle 'CTRL Esquerdo' + C duas vezes seguidas!"; echo ""
  
  for ip in "${ipcc[@]}"; do
    iperf -c "$ip"
  done
  
  read -r -p "Teste finalizado, tecle Enter para sair!"
}

function iperfsrv {
  clear; echo "Entrando no modo Servidor. Para sair antes do teste concluir, tecle 'CTRL Esquerdo' + C"; echo ""
  meuiplocal=$(ip route get 1.1.1.1 | grep -oP 'src \K\S+'); echo "Identifiquei que o IP Servidor é $meuiplocal!"
  iperf -s && read -r -p "Teste finalizado, tecle Enter para sair!"
}

function dwservice0 {
  clear
  curl -sSL --connect-timeout 5 --max-time 0 --retry 3 --retry-delay 2  https://www.dwservice.net/download/dwagent_x86.sh | tee /home/administrador/dwagent_x86.sh >/dev/null
  chmod +x /home/administrador/dwagent_x86.sh
  sudo bash /home/administrador/dwagent_x86.sh
}

function satas {
  gouge=10
  find /sys/class/scsi_host/host* -maxdepth 0 -print0 | while IFS= read -r -d '' number; do
    echo "0 0 0" | sudo tee "$number"/scan; clear
    gauge1 $((gouge+20)) "Scaneando e validando portas SATA"
    sleep 1
  done
  dialog --title 'Informacao:' --msgbox "Concluido!" 0 0
}

function change_hostname {
  # Captura o hostname atual
  current_hostname=$(hostname)
  current_fqdn=$(hostname -f 2>/dev/null || echo "$current_hostname")
  
  # Exibe informações atuais
  dialog --title "Hostname Atual" --msgbox "Hostname atual: $current_hostname\nFQDN atual: $current_fqdn" 8 50
  
  # Solicita o novo hostname
  if ! new_hostname=$(dialog --title "Alterar Hostname" --backtitle "Configuração de Sistema" --inputbox "Digite o novo hostname:\n\nRegras:\n- Apenas letras, números e hífens\n- Máximo 63 caracteres\n- Não pode começar ou terminar com hífen" 12 50 "$current_hostname" 2>&1 > /dev/tty); then
    return
  fi
  
  # Validação básica do hostname
  if [ -z "$new_hostname" ]; then
    dialog --title "ERRO" --msgbox "O hostname não pode estar vazio!" 6 40
    return
  fi
  
  # Verifica se o hostname contém apenas caracteres válidos
  if ! echo "$new_hostname" | grep -q '^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$\|^[a-zA-Z0-9]$'; then
    dialog --title "ERRO" --msgbox "Hostname inválido!\n\nUse apenas:\n- Letras (a-z, A-Z)\n- Números (0-9)\n- Hífens (-)\n\nNão pode começar ou terminar com hífen." 10 50
    return
  fi
  
  # Verifica o comprimento
  if [ ${#new_hostname} -gt 63 ]; then
    dialog --title "ERRO" --msgbox "Hostname muito longo!\nMáximo: 63 caracteres\nAtual: ${#new_hostname} caracteres" 8 40
    return
  fi
  
  # Confirmação
  if ! dialog --title "Confirmação" --backtitle "Alteração de Hostname" --yesno "Alterar hostname de:\n'$current_hostname'\npara:\n'$new_hostname'\n\nTem certeza?" 10 50; then
    dialog --title "Cancelado" --msgbox "Alteração cancelada pelo usuário." 6 40
    return
  fi
  
  # Executa as alterações
  change_hostname_execute "$new_hostname"
}

# Função para executar a alteração do hostname
function change_hostname_execute {
  local new_hostname="$1"
  local current_hostname=$(hostname)
  local temp_file="/tmp/hosts_backup_$(date +%s)"
  
  # Backup do /etc/hosts
  if ! sudo cp /etc/hosts "$temp_file"; then
    dialog --title "ERRO" --msgbox "Falha ao criar backup do /etc/hosts!" 6 40
    return
  fi
  
  dialog --title "Processando" --infobox "Alterando hostname...\nPor favor, aguarde..." 5 30
  
  # 1. Altera via hostnamectl
  if ! sudo hostnamectl set-hostname "$new_hostname"; then
    dialog --title "ERRO" --msgbox "Falha ao definir hostname via hostnamectl!" 6 40
    return
  fi
  
  # 2. Atualiza /etc/hosts
  # Remove entradas antigas do hostname
  sudo sed -i "/$current_hostname/d" /etc/hosts
  
  # Adiciona novas entradas
  if ! grep -q "127.0.0.1.*$new_hostname" /etc/hosts; then
    sudo sed -i "1a\\127.0.0.1\t$new_hostname" /etc/hosts
  fi
  
  if ! grep -q "127.0.1.1.*$new_hostname" /etc/hosts; then
    sudo sed -i "/127.0.0.1.*$new_hostname/a\\127.0.1.1\t$new_hostname" /etc/hosts
  fi
  
  # 3. Atualiza /etc/hostname (backup method)
  echo "$new_hostname" | sudo tee /etc/hostname > /dev/null
  
  sleep 1
  
  # Verifica se a alteração foi bem-sucedida
  local verification_hostname=$(hostnamectl --static)
  
  if [ "$verification_hostname" = "$new_hostname" ]; then
    dialog --title "Sucesso" --msgbox "Hostname alterado com sucesso!\n\nAnterior: $current_hostname\nNovo: $new_hostname\n\nBackup do /etc/hosts salvo em:\n$temp_file\n\nReinicie o sistema para garantir que todas as aplicações reconheçam a mudança." 12 60
  else
    # Restaura backup em caso de falha
    sudo cp "$temp_file" /etc/hosts
    dialog --title "ERRO" --msgbox "Falha na alteração do hostname!\n\nO /etc/hosts foi restaurado do backup.\nVerifique as permissões e tente novamente." 8 50
  fi
}

# Função para visualizar informações do hostname
function show_hostname_info {
  local current_hostname=$(hostname)
  local static_hostname=$(hostnamectl --static)
  local pretty_hostname=$(hostnamectl --pretty 2>/dev/null || echo "Não definido")
  local transient_hostname=$(hostnamectl --transient)
  local fqdn=$(hostname -f 2>/dev/null || echo "Não disponível")
  local domain=$(hostname -d 2>/dev/null || echo "Não definido")
  
  # Captura conteúdo relevante do /etc/hosts
  local hosts_content=$(grep -E "(127\.0\.0\.1|127\.0\.1\.1)" /etc/hosts | head -5)
  
  dialog --title "Informações do Hostname" --msgbox "Hostname atual: $current_hostname
Hostname estático: $static_hostname  
Hostname transiente: $transient_hostname
Hostname pretty: $pretty_hostname
FQDN: $fqdn
Domínio: $domain

Entradas relevantes em /etc/hosts:
$hosts_content" 15 70
}

# Menu principal para hostname
function hostname_menu {
  if ! var0=$(dialog --title "Gerenciamento de Hostname" --backtitle "Configurações do Sistema" --menu "Selecione uma opção:" 0 0 0 \
  1 'Visualizar informações do hostname' \
  2 'Alterar hostname' \
  3 'Verificar arquivo /etc/hosts' \
  4 'Testar resolução de nome' \
  X 'Voltar' 2>&1 > /dev/tty); then
    return
  fi
  
  case "$var0" in
  1) show_hostname_info ; hostname_menu ;;
  2) change_hostname ; hostname_menu ;;
  3) show_hosts_file ; hostname_menu ;;
  4) test_hostname_resolution ; hostname_menu ;;
  X) return ;;
  esac
}

# Função para mostrar o arquivo /etc/hosts
function show_hosts_file {
  local hosts_content=$(cat /etc/hosts)
  dialog --title "Conteúdo do /etc/hosts" --msgbox "$hosts_content" 20 80
}

# Função para testar resolução de nome
function test_hostname_resolution {
  local current_hostname=$(hostname)
  local test_results=""
  
  dialog --title "Testando" --infobox "Testando resolução de nomes...\nPor favor, aguarde..." 5 40
  
  # Testa resolução local
  if ping -c 1 "$current_hostname" >/dev/null 2>&1; then
    test_results="✅ Resolução local: OK\n"
  else
    test_results="❌ Resolução local: FALHA\n"
  fi
  
  # Testa resolução localhost
  if ping -c 1 localhost >/dev/null 2>&1; then
    test_results="${test_results}✅ Localhost: OK\n"
  else
    test_results="${test_results}❌ Localhost: FALHA\n"
  fi
  
  # Testa resolução DNS externa
  if ping -c 1 google.com >/dev/null 2>&1; then
    test_results="${test_results}✅ DNS externo: OK\n"
  else
    test_results="${test_results}❌ DNS externo: FALHA\n"
  fi
  
  # Mostra resultados
  dialog --title "Resultados do Teste" --msgbox "Resultados da resolução de nomes:\n\n$test_results\nHostname testado: $current_hostname" 10 50
}

function dnstest {
Google_P=$(ping1 "8.8.4.4")
gauge1 "8" "Testando ping para 8.8.4.4"
Google_S=$(ping1 "8.8.8.8")
gauge1 "14" "Testando ping para 8.8.8.8"
OpenDNS_P=$(ping1 "208.67.222.222")
gauge1 "19" "Testando ping para 208.67.222.222"
OpenDNS_S=$(ping1 "208.67.220.220")
gauge1 "22" "Testando ping para 208.67.220.220"
Level3_P=$(ping1 "4.2.2.1")
gauge1 "24" "Testando ping para 4.2.2.1"
Level3_S=$(ping1 "4.2.2.2")
gauge1 "28" "Testando ping para 4.2.2.2"
Comodo_P=$(ping1 "8.26.56.26")
gauge1 "32" "Testando ping para 8.26.56.26"
Comodo_S=$(ping1 "8.20.247.20")
gauge1 "36" "Testando ping para 8.20.247.20"
DNSWATCH_P=$(ping1 "84.200.69.80")
gauge1 "42" "Testando ping para 84.200.69.80"
DNSWATCH_S=$(ping1 "84.200.70.40")
gauge1 "46" "Testando ping para 84.200.70.40"
Quad9_P=$(ping1 "9.9.9.9")
gauge1 "50" "Testando ping para 9.9.9.9"
Quad9_S=$(ping1 "149.112.112.112")
gauge1 "57" "Testando ping para 149.112.112.112"
Cloudflare_P=$(ping1 "1.1.1.1")
gauge1 "67" "Testando ping para 1.1.1.1"
Cloudflare_S=$(ping1 "1.0.0.1")
gauge1 "74" "Testando ping para 1.0.0.1"
Algar_P=$(ping1 "200.225.197.34")
gauge1 "79" "Testando ping para 200.225.197.34"
Algar_S=$(ping1 "200.225.197.37")
gauge1 "85" "Testando ping para 200.225.197.37"
GIGA_P=$(ping1 "189.38.95.95")
gauge1 "88" "Testando ping para 189.38.95.95"
GIGA_S=$(ping1 "189.38.95.96")
gauge1 "93" "Testando ping para 189.38.95.96"
CLARO_P=$(ping1 "181.213.132.2")
gauge1 "98" "Testando ping para 181.213.132.2"
CLARO_S=$(ping1 "181.213.132.3")
gauge1 "100" "Testando ping para 181.213.132.3"

TEXTAO01="Google ..... 8.8.4.4 .........: $Google_P
Google ..... 8.8.8.8 .........: $Google_S
OpenDNS .... 208.67.222.222 ..: $OpenDNS_P
OpenDNS .... 208.67.220.220 ..: $OpenDNS_S
Level3 ..... 4.2.2.1 .........: $Level3_P
Level3 ..... 4.2.2.2 .........: $Level3_S
Comodo ..... 8.26.56.26 ......: $Comodo_P
Comodo ..... 8.20.247.20 .....: $Comodo_S
DNSWATCH ... 84.200.69.80 ....: $DNSWATCH_P
DNSWATCH ... 84.200.70.40 ....: $DNSWATCH_S
Quad9 ...... 9.9.9.9 .........: $Quad9_P
Quad9 ...... 149.112.112.112 .: $Quad9_S
Cloudflare . 1.1.1.1 .........: $Cloudflare_P
Cloudflare . 1.0.0.1 .........: $Cloudflare_S
Algar ...... 200.225.197.34 ..: $Algar_P
Algar ...... 200.225.197.37 ..: $Algar_S
GigaDNS .... 189.38.95.95 ....: $GIGA_P
GigaDNS .... 189.38.95.96 ....: $GIGA_S
Claro ...... 181.213.132.2 ...: $CLARO_P
Claro ...... 181.213.132.3 ...: $CLARO_S"

dialog --title "VISUALIZANDO DADOS" --backtitle "" --msgbox "Pressione Enter para visualizar os resultados! \n\nNavegue com as setas para cima e para baixo. \n\nPara sair pressione 'q' !" 12 40
clear; echo "$TEXTAO01" | less
#dialog --title 'Resultados do Teste Ping:' --msgbox "$TEXTAO01" 0 0
}

function gauge1 {
  clear
  echo  "$1" | dialog --title "Aguarde!" --gauge "$2" 8 40
  sleep 0.5
}

function ping1 {
  ping -c 1 "$1" | awk 'NR==2{print $7,$8}' |  cut -c7-
}

start

exit 1
