#!/bin/sh

set -eu

readonly RED="\033[0;31m"
readonly GREEN="\033[0;32m"
readonly YELLOW="\033[0;33m"
readonly NC="\033[0m"

print_message() {
    local color=$1
    local message=$2
    echo "${color}${message}${NC}"
}

print_message $GREEN "Starting Puavo Exam Room Server in Naksu mode..."

print_message $YELLOW "[$(date '+%Y-%m-%d %H:%M:%S')]"

puavo_ers_dir="${HOME}/.puavo/puavo-ers"

if ! mkdir -p "$puavo_ers_dir"; then
  logger -p user.err -t puavo-ers-naksu \
         "could not create ${puavo_ers_dir}"
  exit 1
fi

# naksu is self-updating so do not overwrite in case it exists
if [ ! -x "${puavo_ers_dir}/naksu" ]; then
  if ! install -m 755 /opt/abitti-naksu/naksu "${puavo_ers_dir}/naksu"; then
    logger -p user.err -t puavo-ers-naksu \
           "could not install ${puavo_ers_dir}/naksu"
    exit 1
  fi
fi

print_message $GREEN "Checking VirtualBox kernel module..."

# Wait for the VirtualBox kernel module to load
for i in 4 8 16 32 64; do
  if [ -e /dev/vboxdrv ]; then
    break
  fi
  print_message $YELLOW "Waiting for vboxdrv to load in kernel..."
  logger -p user.warning -t puavo-ers-naksu 'waiting for vboxdrv to load in kernel'
  sleep "$i"
done

if [ ! -e /dev/vboxdrv ]; then
  logger -p user.err -t puavo-ers-naksu '/dev/vboxdrv not found after waiting'
  exit 1
fi

print_message $GREEN "VirtualBox kernel module loaded."
sleep 2

cd "$puavo_ers_dir"

while true; do
  print_message $GREEN "Starting Naksu..."
  print_message $YELLOW "[$(date '+%Y-%m-%d %H:%M:%S')]"
  logger -p user.notice -t puavo-ers-naksu 'starting up naksu'
  if ! ${puavo_ers_dir}/naksu --self-update=enabled; then
    print_message $RED "Naksu failed to start. Will try again in 5 seconds..."
    logger -p user.err -t puavo-ers-naksu 'error when running naksu'
  fi
  sleep 5
done
