#!/usr/bin/env bash

# Colors for better overview
GREEN='\033[0;32m'
BLUE='\033[1;34m'
YELLOW='\033[1;33m'
RED='\033[1;31m'
NORMAL='\033[0;39m'
PURPLE='\033[0;35m'

INSTALLATION_PATH="/opt/myspeed"

while getopts "d:" o > /dev/null 2>&1; do
    # shellcheck disable=SC2220
    case "${o}" in
        d) INSTALLATION_PATH=${OPTARG} ;;
    esac
done

# Root check
if [ $EUID -ne 0 ]; then
  echo -e "$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-"
  echo -e "$RED✗ ABGEBROCHEN"
  echo -e "$NORMAL Die Installation läuft derzeit über einen Benutzer ohne Root-Rechte. Dies ist allerdings erforderlich. Melde dich mit einem Root Account an, um fortzufahren."
  echo -e "$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-$RED-$NORMAL-"
  exit
fi

echo -e "$GREEN ---------$BLUE Automatische Installation$GREEN ---------"
echo -e "$BLUE MySpeed$YELLOW wird nun installiert."
if [ "$1" == "--beta" ]; then
  echo -e "$YELLOW Version:$BLUE MySpeed$PURPLE Beta"
else
  echo -e "$YELLOW Version:$BLUE MySpeed Release"
fi
echo -e "$YELLOW Ort:$BLUE $INSTALLATION_PATH"
echo -e "$YELLOW Es wird die Speedtest API von Ookla verwendet."
echo -e "$YELLOW Wenn du damit$RED nicht$YELLOW einverstanden bist,"
echo -e "$YELLOW kannst du die Installation mit$RED STRG + C$YELLOW abbrechen. "
echo -e "$GREEN Die Installation beginnt in 10 Sekunden..."
echo -e "$GREEN ----------------------------------------------"
sleep 10
clear

# Check if installed
if [ -d "$INSTALLATION_PATH" ]; then
    clear
    echo -e "$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-"
    echo -e ""
    echo -e "$YELLOW⚠ WARNUNG"
    echo -e "$NORMAL MySpeed ist bereits auf diesem System installiert."
    echo -e ""
    echo -e "$GREENℹ Info:$NORMAL Neuestes Update wird installiert..."
    echo -e ""
    echo -e "$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-$YELLOW-$NORMAL-"
    sleep 5
fi

if command -v systemctl &> /dev/null && systemctl --all --type service | grep -n "myspeed.service"; then
  clear
  echo -e "$YELLOWℹ MySpeed Dienst wird gestoppt..."
  systemctl stop myspeed
fi


# Update all packages
clear
echo -e ""
echo -e "$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-"
echo -e ""
echo -e "$BLUE🔎 STATUSMELDUNG"
echo -e "$NORMAL Update-Suche für Linux-System gestartet..."
echo -e ""
echo -e "$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-"
echo -e ""
apt-get update -y

clear
echo -e "$GREENℹ Info:$NORMAL Die Installation wird jetzt vorbereitet. Das kann einen Augenblick dauern..."
sleep 5

function check() {
  clear
  echo -e "$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-"
  echo -e "$BLUE🔎 STATUSMELDUNG"
  echo -e "$NORMAL Es wird überprüft, ob $1 vorhanden ist..."
  echo -e "$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-$BLUE-$NORMAL-"
  echo -e ""
  if ! command -v "$1" &> /dev/null
  then
      echo -e "$YELLOWℹ \"$1\" ist nicht installiert.$NORMAL Die Installation wird gestartet..."
      sleep 2
      echo -e "$PURPLEℹ Wird installiert..."
      apt-get install "$1" -y
  fi
}

check "wget"
check "unzip"
check "curl"

# Check for node
clear
echo -e "$BLUE🔎 STATUSMELDUNG"
echo -e "$NORMAL Es wird überprüft, ob node vorhanden ist..."
if ! command -v node &> /dev/null
then
    echo -e "$YELLOWℹ \"node\" ist nicht installiert.$NORMAL Die Installation wird gestartet..."
    sleep 2
    clear
    echo -e "$PURPLEℹ Wird heruntergeladen...$NORMAL"
    curl -sSL https://deb.nodesource.com/setup_16.x | bash
    clear
    echo -e "$PURPLEℹ Wird installiert...$NORMAL"
    apt-get install nodejs -y
fi

clear

if [ "$1" == "--beta" ]; then
  RELEASE_URL=https://github.com/gnmyt/myspeed/archive/refs/heads/development.zip
else
  RELEASE_URL=$(curl -s https://api.github.com/repos/gnmyt/myspeed/releases/latest | grep browser_download_url | cut -d '"' -f 4)
fi


echo -e "$GREEN✓ Vorbereitung abgeschlossen:$NORMAL Die Installation von MySpeed wird jetzt gestartet..."
sleep 3

clear
if [ ! -d "$INSTALLATION_PATH" ]
then
    clear
    echo -e "$BLUEℹ Info: $NORMAL MySpeed wird unter dem Verzeichnis $INSTALLATION_PATH installiert. Der Ordner wird nun erstellt."
    sleep 2
    mkdir "$INSTALLATION_PATH"
fi

cd "$INSTALLATION_PATH"

clear
echo -e "$BLUEℹ Info: $NORMAL Die aktuelle MySpeed-Instanz wird heruntergeladen. Einen Moment..."
sleep 2
wget "$RELEASE_URL"

echo -e "$BLUEℹ Info: $NORMAL Download abgeschlossen. Entpacken läuft..."
sleep 2
if [ "$1" == "--beta" ]; then
  unzip -qo development.zip
  rm -R server client docs cli
  mv myspeed-*/* .
  rm development.zip
  rm -R myspeed-development
else
  unzip -qo MySpeed*.zip
  rm MySpeed-*.zip
fi


clear
echo -e "$BLUEℹ Info: $NORMAL Die notwendigen Abhängigkeiten werden jetzt installiert..."
sleep 2
rm -rf "$INSTALLATION_PATH/node_modules"
npm install --force

if [ "$1" == "--beta" ]; then
  clear
  echo -e "$BLUEℹ Info: $NORMAL Die Weboberfläche wird kompiliert..."
  sleep 2
  cd client && npm install --force
  cd .. && npm run build
  cp -r client/build .
  rm -rf client/build
fi

# Install as system service
clear
echo -e "$BLUE🔎 STATUSMELDUNG"
echo -e "$NORMAL Registriere MySpeed als Hintergrunddienst..."
echo -e ""
echo -e ""
sleep 2
if command -v systemctl &> /dev/null && ! systemctl --all --type service | grep -n "myspeed.service"; then
  cat << EOF >> /etc/systemd/system/myspeed.service
  [Unit]
  Description=MySpeed
  After=network.target

  [Service]
  Type=simple
  ExecStart=/usr/bin/node server
  Restart=always
  User=root
  Environment=NODE_ENV=production
  WorkingDirectory=$INSTALLATION_PATH

  [Install]
  WantedBy=multi-user.target
EOF
  systemctl daemon-reload
  echo -e "$NORMALℹ MySpeed wird im Autostart hinzugefügt..."
  sleep 1
  systemctl enable myspeed
  echo -e "$NORMALℹ MySpeed Dienst wird gestartet..."
  sleep 1
  systemctl start myspeed
fi

clear

if ! command -v systemctl &> /dev/null; then
    echo -e "$YELLOW⚠ Warnung: $NORMAL Dein Linux-System bietet derzeit nicht die Möglichkeit, MySpeed im Hintergrund zu starten. Hierfür wird \"systemd\" benötigt."
    echo -e "$BLUEℹ Info: $NORMAL Du kannst, wenn du \"systemd\" installiert hast, die Installation erneut starten. Es wird dann automatisch eingestellt."
    sleep 5
else
  echo -e "$GREENℹ MySpeed wird neu gestartet..."
  sleep 2
  systemctl restart myspeed
fi

clear
echo -e "$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-" #multicolor
echo -e "$GREEN✓ Installation abgeschlossen: $NORMAL MySpeed wurde unter $INSTALLATION_PATH installiert."
echo -e "Die Weboberfläche findest du im Browser unter$BLUE http://$(curl -s ifconfig.me):5216$NORMAL."
if [ -d "$INSTALLATION_PATH" ]; then
  echo -e "$BLUEℹ Info:$NORMAL Sollte das Update nicht erfolgreich angewendet worden sein, bitte starte MySpeed mal neu:$BLUE systemctl restart myspeed"
fi
echo -e "$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-$GREEN-$NORMAL-" #multicolor
# MySpeed is installed successfully.
