#!/bin/bash
set -u

# Usage:
# cd /opt/perforce/dev/bin
# ./setup_test_machine.sh 2>&1 | tee log.setup_test_machine.txt

declare ThisScript=${0##*/}
declare ThisHost=${HOSTNAME%%.*}
declare ThisUser=
# shellcheck disable=SC2016
declare VersionInfo='$Id: //test-install_sdp/dev/setup_test_machine.sh#1 $ $Change: 33144 $'
declare VersionStream=${VersionInfo%/*}
declare VersionStream=${VersionStream##*/}
declare VersionRev=${VersionInfo%% \$ \$Change:*}
declare VersionRev=${VersionRev##*#}
declare Version="$VersionStream.$VersionRev"
declare -i ErrorCount=0
declare PackageManager=

#------------------------------------------------------------------------------
# Functions msg(), errmsg, and bail().
# Sample Usage:
#    bail "Missing something important. Aborting."
#    bail "Aborting with exit code 3." 3
function msg () { echo -e "$*"; }
function errmsg () { msg "\nError: ${1:-Unknown Error}\n"; ErrorCount+=1; }
function bail () { errmsg "${1:-Unknown Error}"; exit "${2:-1}"; }

#------------------------------------------------------------------------------
#  Main Program

ThisUser=$(id -n -u)
msg "Starting $ThisScript version $Version as $ThisUser@$ThisHost on $(date)."
[[ "$ThisUser" == root ]] || bail "Run as root, not user $ThisUser."

if [[ -n "$(command -v yum)" ]]; then
   PackageManager=yum
elif [[ -n "$(command -v apt-get)" ]]; then
   PackageManager=apt-get
elif [[ -n "$(command -v zypper)" ]]; then
   PackageManager=zypper
else
   bail "Error: Unknown Package Manager; not yum or apt-get. Aborting."
fi

case "$PackageManager" in
   (yum)
      if rpm -q rsync >/dev/null 2>&1; then
         msg "Verified: rsync package is installed."
      else
         yum install -y rsync ||\
            errmsg "Failed to install rsync package with $PackageManager."
      fi
   ;;
   (apt-get)
      if dpkg-query -W -f='${Status}' rsync 2>/dev/null | grep -q "install ok installed"; then
         msg "Verified: rsync package is installed."
      else
         apt-get update ||\
            errmsg "The call to 'apt-get update' had a non-zero exit code. Ignoring."
         apt-get install -y rsync ||\
            errmsg "Failed to install rsync package with $PackageManager."
      fi
   ;;
   (zypper)
      if rpm -q rsync >/dev/null 2>&1; then
         msg "Verified: rsync package is installed."
      else
         zypper refresh ||\
            errmsg "The call to 'zypper refresh' had a non-zero exit code. Ignoring."
         zypper install -y rsync ||\
            errmsg "Failed to install rsync package with $PackageManager."
      fi
   ;;
   (*) bail "Internal error; unexpected PackageManager ($PackageManager).";;
esac

if [[ ! -r ~/.config/nvim/init.lua ]]; then
   msg "Configuring Neovim."
   if [[ -r /opt/perforce/dev/bin/nvim.init.lua ]]; then
      mkdir -p ~/.config/nvim
      cd ~/.config/nvim
      ln -s /opt/perforce/dev/bin/nvim.init.lua init.lua
      cd - > /dev/null
   elif [[ -r /opt/perforce/.dev/bin/nvim.init.lua ]]; then
      mkdir -p ~/.config/nvim
      cd ~/.config/nvim
      ln -s /opt/perforce/.dev/bin/nvim.init.lua init.lua
      cd - > /dev/null
   fi
else
   msg "Skipping Neovim config; already configured."
fi

if [[ "$ErrorCount" -eq 0 ]]; then
   msg "\nSuccess: Processing complete with no errors."
else
   errmsg "Processing completed, but with $ErrorCount errors."
fi

exit "$ErrorCount"
