#!/bin/bash

set -e

function showHelp() {
  cat <<HELP
  install-devruntime is used to install optional runtimes for developing in a
  code-server container environment.

  Syntax: install-devruntime RUNTIME ...
  RUNTIME         [dotnet|golang|nodejs|powershell]
    dotnet        Installs latest LTS dotnet core sdk + runtime.
    golang        Installs golang 1.19.3.
    nodejs        Installs latest NodeJs LTS version.
    powershell    Installs latest PowerShell LTS version.
  disablemotd     Disables hint in new bash terminal.
  codesetting    Sets VS Code user setting with basic (Fira Code).
  -h              Prints this help messagee.

  Example 1: install-devruntime dotnet
  Example 2: install devruntime golang nodejs
HELP
}

function disableMotd() {
  if [[ -e "$HOME/enable_motd" ]]; then
    say "Disabling 'install-devruntime' motd..." "disableMotd"
    rm -f "$HOME/enable_motd"
  fi
}

function say() {
  if [[ -n "$2" ]]; then
    echo -e "\e[32mInstall-DevRuntime\e[0m \e[34m[$2]\e[0m: $1"
  else
    echo -e "\e[32mInstall-DevRuntime\e[0m: $1"
  fi
}

function sayE() {
  if [[ -n "$2" ]]; then
    echo -e "\e[31mInstall-DevRuntime\e[0m \e[34m[$2]\e[0m: $1" 1>&2
  else
    echo -e "\e[31mInstall-DevRuntime\e[0m: $1" 1>&2
  fi
}

function instDotNet() {
  say "Installing dotnet requirements..." "dotnet"
  sudo apt-get update > /dev/null
  sudo apt-get install --no-install-recommends -y \
    libicu70

  say "Downloading latest install script..." "dotnet"
  curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh
  chmod +x /tmp/dotnet-install.sh

  say "Installing latest .NET Core LTS release..." "dotnet"
  /tmp/dotnet-install.sh --channel LTS
  echo 'export PATH=$PATH:/config/.dotnet' | sudo tee -a /etc/bash.bashrc > /dev/null

  say "Cleaning up..." "dotnet"
  sudo apt-get clean
  sudo rm -rf \
    /tmp/* \
    /var/lib/apt/lists/* \
    /var/tmp/*
  say "dotnet done. " "dotnet"
}

function instGoLang() {
  if [[ -z "$1" ]]; then
    GOVERSION="1.19.3"
  else
    GOVERSION="$1"
  fi

  say "Downloading golang ($GOVERSION)..." "GoLang"
  curl -fsSL "https://go.dev/dl/go$GOVERSION.linux-amd64.tar.gz" -o /tmp/golang.tar.gz
  say "Installing golang ($GOVERSION)...." "GoLang"
  sudo rm -rf /usr/local/go
  sudo tar -C /usr/local -xzf /tmp/golang.tar.gz
  echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee -a /etc/bash.bashrc > /dev/null
  say "Cleaning up..." "GoLang"
  rm -f /tmp/golang.tar.gz
  say "done." "GoLang"
  say "Please reload bash profile to finalize." "GoLang"
}

function instNodeJs() {
  say "Adding nodesource package source (NodeJS LTS)..." "NodeJs"
  curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
  say "Updating package lists and installing NodeJS LTS..." "NodeJs"
  sudo apt-get install --no-install-recommends -y \
    nodejs

  say "Cleaning up..." "NodeJs"
  sudo apt-get clean
  sudo rm -rf \
    /tmp/* \
    /var/lib/apt/lists/* \
    /var/tmp/*

  say "done." "NodeJs"
}

function instPwsh() {
  say "Installing PowerShell requirements..." "PowerShell"
  sudo apt-get install --no-install-recommends -y \
    apt-transport-https \
    software-properties-common

  say "Adding powershell package sources..." "PowerShell"
  # Download the Microsoft repository GPG keys
  curl -fsSL "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb" -o /tmp/packages-microsoft-prod.deb
  # Register the Microsoft repository GPG keys
  sudo dpkg -i /tmp/packages-microsoft-prod.deb
  # Update the list of packages after we added packages.microsoft.com
  sudo apt-get update

  say "Installing PowerShell..." "PowerShell"
  # Install PowerShell
  sudo apt-get install --no-install-recommends -y powershell

  echo "done." "PowerShell"
}

function setCodeSettings() {
  CODEFILE="$HOME/data/User/settings.json"
  say "Setting VScode base settings.($CODEFILE)"
  cat <<EOF | tee "$CODEFILE"
{
  "workbench.colorTheme": "One Dark Pro Darker",
  "window.menuBarVisibility": "classic",
  "editor.fontFamily": "'FiraCode', 'FiraCode Nerd Font', 'FiraCode NF', Consolas, 'Courier New', monospace",
  "terminal.integrated.fontFamily": "'FiraCode Mono', 'FiraCode Nerd Font Mono', 'FiraCode NFM', Consolas, monospace",
  "editor.fontLigatures": true,
  "workbench.iconTheme": "vscode-icons",
  "extensions.autoUpdate": false,
  "git.confirmSync": false
}
EOF
}

function main() {
  if [[ "$#" == "0" ]]; then
    showHelp
    exit 0
  fi

  for i in $@; do
    if [[ "$1" == "-h" ]]; then
      showHelp
      exit 0
    elif [[ "$i" == "dotnet" ]]; then
      instDotNet
    elif [[ "$i" == "golang" ]]; then
      instGoLang
    elif [[ "$i" == "nodejs" ]]; then
      instNodeJs
    elif [[ "$i" == "powershell" ]]; then
      instPwsh
    elif [[ "$i" == "disablemotd" ]]; then
      disableMotd
      exit 0
    elif [[ "$i" == "codesetting" ]]; then
      setCodeSettings
      exit 0
    else
      sayE "Unknown parameter value given!($i)."
      showHelp
      exit 1
    fi
  done
}

main $@
