#!/bin/bash

ARMADILLO_SETUP_VER=1.0.3
ARMADILLO_URL="https://github.com/molgenis/molgenis-service-armadillo"
ARMADILLO_RAW_URL="https://raw.githubusercontent.com/molgenis/molgenis-service-armadillo"
ARMADILLO_PROFILE=default
ARMADILLO_PATH=/usr/share/armadillo
ARMADILLO_CFG_PATH=/etc/armadillo
ARMADILLO_SYS_USER=armadillo
ARMADILLO_LOG_PATH=/var/log/armadillo
ARMADILLO_AUDITLOG=$ARMADILLO_LOG_PATH/audit.log
ARMADILLO_DATADIR=$ARMADILLO_PATH/data

handle_args() {
    while :
    do
        case "$1" in 
        --version)
          ARMADILLO_VERSION=$2
          shift 2
          ;;
        --admin-user)
          ARMADILLO_ADMIN=$2
          shift 2
          ;;
        --admin-password)
          ARMADILLO_ADMIN_PW=$2
          shift 2
          ;;
        --domain)
          ARMADILLO_DOMAIN=$2
          shift 2
          ;;
        --datadir)
          ARMADILLO_DATADIR=$2
          shift 2
          ;;
        --oidc)
          ARMADILLO_OIDC_ENABLED=1
          shift
          ;;
        --oidc_url)
          OIDC_ISSUER_URL=$2
          shift 2
          ;;
        --oidc_clientid)
          OIDC_CLIENTID=$2
          shift 2
          ;;
        --oidc_clientsecret)
          OIDC_CLIENTSECRET=$2
          shift 2
          ;;
          --admin-email)
          ARMADILLO_OIDC_ADMIN_EMAIL=$2
          shift 2
          ;;
        --cleanup)
          ARMADILLO_CLEANUP=1
          shift          ;;

        -h | --help)
          parameters_help
          exit 0
          ;;
        -*)
          parameters_help
          exit 0
          ;;
        *)
        break;
        esac
        
    done
    if [ ! "$ARMADILLO_CLEANUP" ]; then
      if [ ! "$ARMADILLO_DOMAIN" ] || [ ! "$ARMADILLO_ADMIN_PW" ]; then
        echo "Arguments --domain --admin-password must be provided"
        echo "You need a host or domain to use Armadillo. Example: cohort.armadillo.organisation.com"
        echo "Also for security reasons you must provide a secure admin password"
        parameters_help; 
        exit 1;
      fi
    fi
    if [ "$ARMADILLO_OIDC_ENABLED" ]; then
      if [ ! "$OIDC_CLIENTID" ] || [ ! "$OIDC_ISSUER_URL" ] || [ ! "$OIDC_CLIENTSECRET" ]; then
        echo "OIDC Option called but mandatory config items are missing --admin-email user@oidc-mailadres.tld --oidc_url <issuer_url> --oidc_clientid <client_id> --oidc_clientsecret <secret> "
        exit 1;
      fi
    fi
}

setup_environment() {
    mkdir -p "$ARMADILLO_PATH/application"
    mkdir -p "$ARMADILLO_PATH/services"
    mkdir -p "$ARMADILLO_LOG_PATH"
    mkdir -p "$ARMADILLO_CFG_PATH"
    mkdir -p "$ARMADILLO_DATADIR"
    useradd -rs /bin/false "$ARMADILLO_SYS_USER"
    chgrp -R "$ARMADILLO_SYS_USER" "$ARMADILLO_PATH"
    chgrp -R "$ARMADILLO_SYS_USER" "$ARMADILLO_CFG_PATH"
    chgrp -R "$ARMADILLO_SYS_USER" "$ARMADILLO_LOG_PATH"
    chgrp -R "$ARMADILLO_SYS_USER" "$ARMADILLO_DATADIR"

    chmod g+rw "$ARMADILLO_LOG_PATH"
    chmod g+rw "$ARMADILLO_DATADIR"
    usermod -aG docker "$ARMADILLO_SYS_USER"
    echo "Environment is being set up correctly"     
}

setup_systemd() {
  cat  > /etc/systemd/system/armadillo.service << EOF
[Unit]
Description=DataSHIELD Armadillo 4
After=syslog.target

[Service]
User=$ARMADILLO_SYS_USER
Environment=SPRING_PROFILES_ACTIVE=$ARMADILLO_PROFILE
Environment=SPRING_CONFIG_ADDITIONAL_LOCATION=$ARMADILLO_CFG_PATH/application.yml
WorkingDirectory=$ARMADILLO_PATH
ExecStart=java -jar $ARMADILLO_PATH/application/armadillo.jar
StandardOutput=append:$ARMADILLO_LOG_PATH/armadillo.log
StandardError=append:$ARMADILLO_LOG_PATH/error.log
Type=simple
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

EOF

systemctl daemon-reload
echo "Armadillo Installed under systemd"
}

setup_armadillo_config() {
  SEED=$(tr -cd '[:digit:]' < /dev/urandom | fold -w 9 | head -n 1)
  wget -q -O /etc/armadillo/application.yml "$ARMADILLO_RAW_URL/v$ARMADILLO_VERSION/scripts/install/conf/application.yml"
  
  
  if [ ! "$ADMINUSER" ]; then 
    ADMINUSER="admin"
  else
    ADMINUSER=$ARMADILLO_ADMIN
  fi

  sed -i -e 's|@LOGPATH@|'"$ARMADILLO_LOG_PATH"'|' $ARMADILLO_CFG_PATH/application.yml
  sed -i -e 's/@ADMINUSER@/'"$ADMINUSER"'/' $ARMADILLO_CFG_PATH/application.yml
  sed -i -e 's/@ADMINPASS@/'"${ARMADILLO_ADMIN_PW}"'/' $ARMADILLO_CFG_PATH/application.yml
  sed -i -e 's|@DATADIR@|'"$ARMADILLO_DATADIR"'|' $ARMADILLO_CFG_PATH/application.yml
  sed -i -e 's/@SEED@/'"$SEED"'/' $ARMADILLO_CFG_PATH/application.yml
  sed -i -e 's|@AUDITLOG@|'"$ARMADILLO_AUDITLOG"'|' $ARMADILLO_CFG_PATH/application.yml
  

  if [ "$ARMADILLO_OIDC_ENABLED" ]; then
  
    sed -i -e 's|@ISSUERURL@|'"$OIDC_ISSUER_URL"'|g' $ARMADILLO_CFG_PATH/application.yml
    sed -i -e 's/@CLIENTID@/'"$OIDC_CLIENTID"'/' $ARMADILLO_CFG_PATH/application.yml
    sed -i -e 's/@CLIENTSECRET@/'"$OIDC_CLIENTSECRET"'/' $ARMADILLO_CFG_PATH/application.yml
    sed -i -e 's/@ARMADILLODOMAIN@/'"$ARMADILLO_DOMAIN"'/' $ARMADILLO_CFG_PATH/application.yml
    sed -i -e 's|# oidc-admin-user: @ADMIN_EMAIL@|oidc-admin-user: '"$ARMADILLO_OIDC_ADMIN_EMAIL"'|' $ARMADILLO_CFG_PATH/application.yml
  fi

  echo "Config downloaded"
}

download_armadillo() {
  
  if [ -z "$ARMADILLO_VERSION" ]; then
    LATEST_RELEASE=$(curl -L -s -H 'Accept: application/json' -s $ARMADILLO_URL/releases/latest)
    ARMADILLO_TAG=$(echo "$LATEST_RELEASE" | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/')
    ARMADILLO_VERSION=$(echo $ARMADILLO_TAG | sed -e 's/.*v//')


    
    if [[ "$ARMADILLO_VERSION" =~ 'armadillo-service-2' ]]; then
      echo "Armadillo version 2 not supported! Please provide an armadillo 3 version with --version"
      exit 1;
    fi
  fi

  DL_URL="$ARMADILLO_URL/releases/download/v$ARMADILLO_VERSION/molgenis-armadillo-$ARMADILLO_VERSION.jar"

  if validate_url $DL_URL; then

    wget -q -O $ARMADILLO_PATH/application/armadillo-"$ARMADILLO_VERSION".jar "$DL_URL"
    ln -s $ARMADILLO_PATH/application/armadillo-"$ARMADILLO_VERSION".jar $ARMADILLO_PATH/application/armadillo.jar
    echo "$ARMADILLO_VERSION downloaded"
  
  else 
    echo "[ERROR] Error in downloading armadillo, please contact molgenis-support@umcg.nl with your error."
    exit 1;
  fi
}


check_req() {
  for COMMAND in "java" "wget" "docker" "curl" "whoami"; do
    command_exists "${COMMAND}"
  done

  if [ "$(whoami)" != 'root' ]; then
    echo '[ERROR] Please run this script with root or sudo rights!'
    exit 1;
  fi

}

setup_updatescript() {
  # Download update script
  UPDATE_SCRIPT="armadillo-check-update.sh"
  CRON_NAME="armadillo-check-update"
  DL_URL="$ARMADILLO_RAW_URL/v$ARMADILLO_VERSION/scripts/install/$UPDATE_SCRIPT"
  if validate_url "$DL_URL" ; then
    UPDATE_SCRIPT_PATH="$ARMADILLO_PATH/application/$UPDATE_SCRIPT"

    wget -q -O "$UPDATE_SCRIPT_PATH" "$DL_URL"
    echo "Update script downloaded"
    chmod +x "$UPDATE_SCRIPT_PATH"
    ln -s "$UPDATE_SCRIPT_PATH" "/etc/cron.weekly/$CRON_NAME"
      
  else
    echo "[ ERROR ] update script not downloaded"
  fi
}


command_exists() {
    # check if command exists and fail otherwise
    command -v "$1" >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "I require $1 but it's not installed. Abort."
        exit 1
    fi
}


cleanup(){
  if [ "$ARMADILLO_CLEANUP" ]; then
    echo "--cleanup variable defined! Are you sure? Potential data loss! Type y/N"
    read -r -p "Type y/N" response
      if [ "$response" = "y" ]
        then
            systemctl stop armadillo
            systemctl disable armadillo
            rm -Rf $ARMADILLO_PATH
            rm -Rf $ARMADILLO_LOG_PATH
            userdel $ARMADILLO_SYS_USER
            rm -Rf /etc/systemd/system/armadillo.service
            systemctl daemon-reload
            rm -Rf $ARMADILLO_LOG_PATH
            rm -Rf /etc/cron.weekly/check-armadillo-update
            echo "Armadillo cleaned!"
        else
          echo "No cleanup .. please remove the --cleanup argument"
          exit 0
      fi
  fi
}


startup_armadillo() {
  systemctl enable armadillo
  systemctl start armadillo
  echo "Armadillo started"

}


validate_url(){
  if [[ `wget -S --spider $1  2>&1 | grep 'HTTP/1.1 200 OK'` ]]; then
    return 0
  else
    return 1
  fi
}

#Parameters passed in help
parameters_help() {

    echo 'Usage: bash armadillo-setup.sh PARAMS 
       example bash armadillo-setup.sh --admin-user admin --admin-password welcome01 --domain armadillo.cohort.study.com'
    echo
    echo 'Install Script for Armadillo Service'
    echo
    echo 'Params:'
    echo
    echo '    --version armadillo_version   Specify witch version to install'
    echo '    --admin-user user             Specify the Basic-Auth admin user'
    echo '    --admin-password pass         Password for the admin user'
    echo '    --datadir /storage/dir        If defined this would be the Location to store the data otherwise, it would be /usr/share/armadillo/data'
    echo '    --domain                      URL domain which is used for accessing armadillo'
    echo ''
    echo '    --oidc                          For central authentication you can enable oidc'
    echo '      --oidc_url                    URL where the oidc server is listening on'
    echo '      --oidc_clientid               Client id of the oidc config'
    echo '      --oidc_clientsecret           Secret of the client'
    echo '      --admin-email                 Email adres of the oidc Admin User'
}


if [ "$#" -eq 0 ]; then
    echo 'No parameters provided, please provide the correct parameters'
    parameters_help
    exit 0
fi


handle_args "$@"
check_req
cleanup
setup_environment
download_armadillo
setup_updatescript
setup_armadillo_config
setup_systemd
startup_armadillo