#!/bin/sh

set -eu

VERSION="${VG_VERSION:-3.0.260824}"
ARCHIVE_NAME="VideoGraceServer-${VERSION}-x64.tar.bz2"
DOWNLOAD_URL="${VG_DOWNLOAD_URL:-https://videograce.ru/download/${ARCHIVE_NAME}}"
EXPECTED_SHA256="${VG_ARCHIVE_SHA256:-73a01b077130f99dceda9336bbb481643ad8b378e3252a368661dd9b9d298563}"
WORK_DIR=""

fail() {
    printf 'VideoGrace installation failed: %s\n' "$*" >&2
    exit 1
}

cleanup() {
    if [ -n "$WORK_DIR" ] && [ -d "$WORK_DIR" ]; then
        rm -rf -- "$WORK_DIR"
    fi
}

trap cleanup EXIT HUP INT TERM

command -v tar >/dev/null 2>&1 || fail "tar is required"
command -v sha256sum >/dev/null 2>&1 || fail "sha256sum is required"

WORK_DIR=$(mktemp -d "${TMPDIR:-/tmp}/videograce-install.XXXXXX") || fail "cannot create a temporary directory"
ARCHIVE_PATH="$WORK_DIR/$ARCHIVE_NAME"
CONTENTS_PATH="$WORK_DIR/archive-contents.txt"

printf 'Downloading VideoGrace Server %s...\n' "$VERSION"
if command -v curl >/dev/null 2>&1; then
    curl --fail --location --retry 3 --retry-delay 2 --output "$ARCHIVE_PATH" "$DOWNLOAD_URL"
elif command -v wget >/dev/null 2>&1; then
    wget --tries=3 --output-document="$ARCHIVE_PATH" "$DOWNLOAD_URL"
else
    fail "curl or wget is required"
fi

ACTUAL_SHA256=$(sha256sum "$ARCHIVE_PATH" | awk '{print $1}')
[ "$ACTUAL_SHA256" = "$EXPECTED_SHA256" ] || fail "archive checksum mismatch"

tar -tjf "$ARCHIVE_PATH" > "$CONTENTS_PATH" || fail "downloaded file is not a valid tar.bz2 archive"
if grep -Eq '(^/|(^|/)\.\.(/|$))' "$CONTENTS_PATH"; then
    fail "archive contains an unsafe path"
fi

tar -xjf "$ARCHIVE_PATH" -C "$WORK_DIR"
INSTALL_SCRIPT=$(find "$WORK_DIR" -mindepth 2 -maxdepth 2 -type f -name install.sh -print)
[ -n "$INSTALL_SCRIPT" ] || fail "install.sh was not found in the archive"
[ "$(printf '%s\n' "$INSTALL_SCRIPT" | wc -l | tr -d ' ')" = "1" ] || fail "archive contains multiple install.sh files"

chmod +x "$INSTALL_SCRIPT"
printf 'Starting VideoGrace Server installation...\n'
if [ "$(id -u)" -eq 0 ]; then
    "$INSTALL_SCRIPT"
else
    command -v sudo >/dev/null 2>&1 || fail "run this script as root or install sudo"
    sudo "$INSTALL_SCRIPT"
fi

printf 'VideoGrace Server %s installation completed.\n' "$VERSION"
