#!/usr/bin/env bash

THIS_DIR="$(dirname "$0")"
LOG_DIR="/opt/MXB/var/log/AutoUpdate"
LOG_PATH="$LOG_DIR/AutoUpdate.log"
UPDATE_PACKAGE_DIR="/opt/MXB/var/update"

WAIT_FOR_IDLE_TIMEOUT_IN_SECONDS=$((220*60))
SLEEP_BETWEEN_ITERATIONS_TIME_IN_SECONDS=$((3*60))

[ -e "$LOG_DIR" ] || mkdir -p "$LOG_DIR"

_log() # message
{
    echo "$1"
    echo "[$(date)] $1" >> "$LOG_PATH" 2>/dev/null
}

_exit() # exit code
{
    [ -n "$2" ] && _log "$2"
    exit $1
}

waitForFpIdleState()
{
    _log "Waiting for the application to reach idle state..."

    SECONDS=0

    while true ;  do
        _log "Checking application status..."

        fpState="$('/opt/MXB/bin/ClientTool' -machine-readable control.status.get 2>/dev/null)"
        _log "Current application status is $fpState"
        if [ "$fpState" = "Idle" ]; then
            return 0
        fi

        if [ "$SECONDS" -ge "$WAIT_FOR_IDLE_TIMEOUT_IN_SECONDS" ]; then
            _log "Timed out waiting for idle status."
            return 0
        fi

        _log "Sleeping for $SLEEP_BETWEEN_ITERATIONS_TIME_IN_SECONDS sec..."
        sleep $SLEEP_BETWEEN_ITERATIONS_TIME_IN_SECONDS
    done
}

[ "$(id -u)" -eq 0 ] || _exit 1 "Root privileges are required to run this script"

if grep -qw cove_rescue_media /proc/cmdline; then
    _exit 1 "Auto-update is prohibited in the Cove Rescue Media environment."
fi

_log "Checking for updates"

if ! "$THIS_DIR/BackupUP" checkVersion | grep -q true; then
    _log "No new version found"
    exit 0
fi

if [ "$1" = "check" ]; then
    _log "New application version found"
    exit 0
fi

_log "New application version found, downloading update package"

if ! "$THIS_DIR/BackupUP" download; then
    _log "Unable to download update package"
    exit 1
fi

if [ ! -r "$UPDATE_PACKAGE_DIR/_update" ]; then
    _log "No suitable update script found"
    exit 1
fi

if ! chmod 0700 "$UPDATE_PACKAGE_DIR/_update"; then
    _log "Unable to change update script access permissions"
    exit 1
fi

waitForFpIdleState

_log "Running update script"

if ! cd "$UPDATE_PACKAGE_DIR"; then
    _log "Unable to change directory to \"$UPDATE_PACKAGE_DIR\""
    exit 1
fi

if ! "$UPDATE_PACKAGE_DIR/_update" 2>&1 | tee -a "$LOG_PATH"; then
    _log "Update script finished with non-zero code $?"
    exit 1
fi

exit 0
