#!/usr/bin/env bash
set -euo pipefail

SWAP_FILE="${SWAP_FILE:-/swapfile}"
SWAP_SIZE="${SWAP_SIZE:-2G}"
FSTAB_PATH="${FSTAB_PATH:-/etc/fstab}"
PERSIST_ENTRY="${SWAP_FILE} none swap sw 0 0"

usage() {
  cat <<EOF
Uso: $(basename "$0")

Cria e ativa um swapfile de forma idempotente.

Variaveis de ambiente suportadas:
  SWAP_FILE   Caminho do arquivo de swap. Padrao: /swapfile
  SWAP_SIZE   Tamanho do swapfile. Padrao: 2G
  FSTAB_PATH  Caminho do fstab. Padrao: /etc/fstab
EOF
}

if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
  usage
  exit 0
fi

require_root() {
  if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then
    echo "Execute como root ou com sudo." >&2
    exit 1
  fi
}

ensure_swap_not_active_elsewhere() {
  if swapon --show=NAME --noheadings | grep -Fxq "$SWAP_FILE"; then
    echo "Swap ja ativo em $SWAP_FILE"
    return 0
  fi

  return 1
}

create_swap_file() {
  if [[ -f "$SWAP_FILE" ]]; then
    echo "Arquivo de swap ja existe: $SWAP_FILE"
    return 0
  fi

  fallocate -l "$SWAP_SIZE" "$SWAP_FILE"
  chmod 600 "$SWAP_FILE"
  mkswap "$SWAP_FILE"
  echo "Swapfile criado: $SWAP_FILE ($SWAP_SIZE)"
}

ensure_permissions() {
  chmod 600 "$SWAP_FILE"
}

activate_swap() {
  if ensure_swap_not_active_elsewhere; then
    return 0
  fi

  swapon "$SWAP_FILE"
  echo "Swap ativado: $SWAP_FILE"
}

persist_swap() {
  if grep -Fqx "$PERSIST_ENTRY" "$FSTAB_PATH"; then
    echo "Entrada ja existe em $FSTAB_PATH"
    return 0
  fi

  printf '\n%s\n' "$PERSIST_ENTRY" >> "$FSTAB_PATH"
  echo "Entrada adicionada em $FSTAB_PATH"
}

print_summary() {
  echo
  echo "Estado atual do swap:"
  swapon --show || true
  echo
  free -h || true
}

require_root
create_swap_file
ensure_permissions
activate_swap
persist_swap
print_summary

echo
echo "Concluido."