#!/bin/bash
# -*- Mode:bash; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
#
# Copyright (C) 2015-2021, The University of Memphis,
#                          Arizona Board of Regents,
#                          Regents of the University of California.
#
# This file is part of Mini-NDN.
# See AUTHORS.md for a complete list of Mini-NDN authors and contributors.
#
# Mini-NDN is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Mini-NDN is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Mini-NDN, e.g., in COPYING.md file.
# If not, see <http://www.gnu.org/licenses/>.

set -eo pipefail
cd "$(dirname "${BASH_SOURCE[0]}")"

# These commands are generally installed on most systems. If not, user must install manually.
# 'sudo' is not directly used by this script, but Mininet install.sh uses it, so we check that also.
NEEDED_BINARIES=(
  awk
  git
  sudo
)
MISSING_BINARIES=()

SUDO=
if [[ $(id -u) -eq 0 ]]; then
  if [[ -n $SUDO_USER ]] && [[ -z $SKIPSUDOCHECK ]]; then
    cat <<EOT
Do not run this script through sudo
Instead, run this script as a regular user; the script will call sudo when needed
To bypass this check, set the environment variable SKIPSUDOCHECK=1
EOT
    exit 1
  fi
else
  SUDO=sudo
fi

for B in "${NEEDED_BINARIES[@]}"; do
  if ! command -v "$B" >/dev/null; then
    MISSING_BINARIES+=("$B")
  fi
done
if [[ ${#MISSING_BINARIES[@]} -gt 0 ]] ; then
  echo "Missing commands (${MISSING_BINARIES[*]}) to start this script. To install, run:"
  echo "  $SUDO apt install --no-install-recommends ca-certificates curl git mawk sudo"
  echo "  $SUDO yum install ca-certificates curl git mawk sudo"
  exit 1
fi

CODEROOT="$(pwd)/dl"
NJOBS=$(nproc)
MEM_JOBS=$(awk '$1=="MemAvailable:" { print int($2/(1536*1024)); exit }' /proc/meminfo)
if [[ $MEM_JOBS -lt 1 ]]; then
  NJOBS=1
  echo 'Insufficient available RAM, build may fail'
elif [[ $MEM_JOBS -lt $NJOBS ]]; then
  NJOBS=$MEM_JOBS
fi
PREFER_FROM=ppa
PPA_PKGS=()

ARGS=$(getopt -o 'hy' -l 'help,dir:,jobs:,no-wifi,ppa,source,release:,cxx:,dummy-keychain,nfd:,psync:,nlsr:,tools:,traffic:,infoedit:,mininet:,mnwifi:,dl-only,ignore-existing' -- "$@")
eval set -- "$ARGS"
while true; do
  case $1 in
    -h|--help) HELP=1; shift;;
    -y) CONFIRM=1; shift;;
    --dir) CODEROOT=$2; shift 2;;
    --jobs) NJOBS=$((0+$2)); shift 2;;
    --no-wifi) NO_WIFI=1; shift;;
    --ppa) PREFER_FROM=ppa; shift;;
    --source) PREFER_FROM=source; shift;;
    --release) RELEASE_VERSION=$2; source util/releases/current_release.sh; NO_PPA=1; shift 2;;
    --cxx) CXX_VERSION=$2; NO_PPA=1; shift 2;;
    --dummy-keychain) CXX_DUMMY_KEYCHAIN=1; NO_PPA=1; shift;;
    --nfd) NFD_VERSION=$2; NO_PPA=1; shift 2;;
    --psync) PSYNC_VERSION=$2; NO_PPA=1; shift 2;;
    --nlsr) NLSR_VERSION=$2; NO_PPA=1; shift 2;;
    --tools) TOOLS_VERSION=$2; NO_PPA=1; shift 2;;
    --traffic) TRAFFIC_VERSION=$2; NO_PPA=1; shift 2;;
    --infoedit) INFOEDIT_VERSION=$2; shift 2;;
    --mininet) MININET_VERSION=$2; shift 2;;
    --mnwifi) MNWIFI_VERSION=$2; shift 2;;
    --dl-only) DL_ONLY=1; shift;;
    --ignore-existing) IGNORE_EXISTING=1; shift;;
    --) shift; break;;
    *) exit 1;;
  esac
done

if [[ $NJOBS -le 0 ]]; then
  cat <<EOT
--jobs must be a positive integer.
Run ./install.sh -h to see help message.
EOT
  exit 1
fi

if [[ $HELP -eq 1 ]]; then
  cat <<EOT
./install.sh [OPTION]...

General options:
  -h  Display help and exit.
  -y  Skip confirmation.
  --dir=${CODEROOT}
      Set where to download and compile the code.
  --jobs=${NJOBS}
      Set number of parallel jobs.
  --no-wifi
      Do not install Mininet-WiFi.

Install preference options:
  --ppa
      Install available packages from named-data PPA.
      This is the default on Ubuntu, unless a source code version option is used.
  --source
      Install all packages from source code.

Source code version options:
  --release=[RELEASE]
      Use specified major release. To install the most recent, use 'current'. A list of
      other possible values is located in the installation docs.
  --cxx=[VERSION]
      Set ndn-cxx version.
  --dummy-keychain
      Patch ndn-cxx to use dummy KeyChain.
      This disables signing and verifications, which allows experiments to run faster.
      Use this option only if your scenario does not require signature verification.
  --nfd=[VERSION]
      Set NFD version.
  --psync=[VERSION]
      Set PSync version.
  --nlsr=[VERSION]
      Set NLSR version.
  --tools=[VERSION]
      Set NDN Essential Tools version.
  --traffic=[VERSION]
      Set NDN Traffic Generator version.
  --infoedit=[VERSION]
      Set infoedit version.
  --mininet=[VERSION]
      Set Mininet version.
  --mnwifi=[VERSION]
      Set Mininet-WiFi version.
Acceptable version syntaxes:
  * git commit/tag/branch, example: --nfd=NFD-0.7.1
  * git repository (e.g. fork) and commit/tag/branch, example:
      --nfd=https://github.com/named-data/NFD.git@NFD-0.7.1
  * change,patchset on named-data Gerrit, example: --nfd=6236,8

Misc options:
  --dl-only
      Download the source code only.
      You may modify the code in ${CODEROOT} and then rerun this script to install them.
  --ignore-existing
      Ignore already installed binaries and libraries, and attempt to reinstall.
      This is useful if you have modified source code checkout and want to install again.
EOT
  exit 0
fi

trap 'set +e; trap - ERR; echo "Error!"; exit 1;' ERR

PKGDEPDIR="$(pwd)/util/pkgdep"
if [[ -e /etc/os-release ]]; then
  source /etc/os-release
fi
for id in ${ID,,} ${ID_LIKE,,}; do
  if [[ -e $PKGDEPDIR/$id.sh ]]; then
    source "$PKGDEPDIR/$id.sh"
    source "$PKGDEPDIR/common.sh"
    exit 0
  fi
done
echo "Unsupported platform ${ID}, aborting"
exit 1
