#!/usr/bin/env bash

set -Eeuo pipefail

export DEBIAN_FRONTEND=noninteractive
export NEEDRESTART_MODE=a

LOG_FILE="/var/log/setup_speedtest.log"
DNS_SERVERS=("8.8.8.8" "8.8.4.4")
SPEEDTEST_REPO_BASE="https://packagecloud.io/ookla/speedtest-cli/ubuntu/"
SPEEDTEST_KEYRING="/usr/share/keyrings/speedtest.gpg"
SPEEDTEST_SOURCE="/etc/apt/sources.list.d/speedtest.list"

log() {
  local message="$1"
  printf '%b\n' "$message" | tee -a "$LOG_FILE"
}

erro() {
  log "ERRO: $1"
  exit 1
}

run_apt_update() {
  DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt-get update -y
}

get_ubuntu_codename() {
  if [ -r /etc/os-release ]; then
    . /etc/os-release
    [ -n "${VERSION_CODENAME:-}" ] && { echo "$VERSION_CODENAME"; return; }
    [ -n "${UBUNTU_CODENAME:-}" ] && { echo "$UBUNTU_CODENAME"; return; }
  fi
  command -v lsb_release >/dev/null 2>&1 && lsb_release -cs
}

restart_ssh_service() {
  systemctl restart ssh 2>/dev/null && return 0 || true
  systemctl restart sshd 2>/dev/null && return 0 || true
  service ssh restart 2>/dev/null && return 0 || true
  service sshd restart 2>/dev/null && return 0 || true
  return 1
}

install_speedtest() {
  command -v speedtest >/dev/null 2>&1 && { log "Speedtest ja instalado."; return; }

  install -d -m0755 /usr/share/keyrings
  curl -fsSL https://packagecloud.io/ookla/speedtest-cli/gpgkey | gpg --dearmor -o "$SPEEDTEST_KEYRING"
  chmod 0644 "$SPEEDTEST_KEYRING"

  local codename
  for codename in "$(get_ubuntu_codename)" noble jammy focal bionic xenial; do
    [ -z "$codename" ] && continue
    echo "deb [signed-by=$SPEEDTEST_KEYRING] $SPEEDTEST_REPO_BASE $codename main" > "$SPEEDTEST_SOURCE"
    if run_apt_update && DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt-get install -y speedtest; then
      log "Speedtest instalado."
      return
    fi
  done

  erro "Falha ao instalar Speedtest."
}

configure_root_ssh() {
  local pass="$1"
  local cfg="/etc/ssh/sshd_config"

  echo "root:$pass" | chpasswd

  [ -f "$cfg" ] || apt-get install -y openssh-server

  cp "$cfg" "$cfg.bak.$(date +%F-%H%M%S)"

  grep -q "^PermitRootLogin" "$cfg" && \
      sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' "$cfg" || \
      echo "PermitRootLogin yes" >> "$cfg"

  grep -q "^PasswordAuthentication" "$cfg" && \
      sed -i 's/^PasswordAuthentication.*/PasswordAuthentication yes/' "$cfg" || \
      echo "PasswordAuthentication yes" >> "$cfg"

  restart_ssh_service || erro "Falha ao reiniciar SSH."
}

configure_dns_netplan() {
  command -v netplan >/dev/null 2>&1 || return 1
  [ -d /etc/netplan ] || return 1

  local file
  file=$(find /etc/netplan -maxdepth 1 -name "*.yaml" | head -n1)
  [ -n "$file" ] || return 1

  cp "$file" "$file.bak.$(date +%F-%H%M%S)"

  python3 - <<EOF
import yaml
f="$file"
with open(f) as arq:
    data=yaml.safe_load(arq)
network=data.setdefault("network",{})
for sec in ("ethernets","wifis"):
    if sec in network:
        for iface in network[sec].values():
            iface.setdefault("nameservers",{})
            iface["nameservers"]["addresses"]=["8.8.8.8","8.8.4.4"]
with open(f,"w") as arq:
    yaml.safe_dump(data,arq,sort_keys=False)
EOF

  netplan generate && netplan apply
}

configure_dns_resolv_conf() {
cat >/etc/resolv.conf <<EOF
nameserver 8.8.8.8
nameserver 8.8.4.4
EOF
}

configure_dns() {
  configure_dns_netplan && return
  configure_dns_resolv_conf
}

main() {
  [ "$(id -u)" -eq 0 ] || erro "Execute como root."
  [ $# -ge 1 ] || erro "Uso: $0 SENHA_ROOT"

  touch "$LOG_FILE"

  run_apt_update
  DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt-get upgrade -y

  DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    iproute2 \
    lsb-release \
    python3 \
    python3-yaml

  install_speedtest
  configure_root_ssh "$1"
  configure_dns

  log "SCRIPT FINALIZADO COM SUCESSO."
}

main "$@"
