#!/bin/bash
# SPDX-FileCopyrightText: 2020 Luca Beltrame <lbeltrame@kde.org>
# SPDX-License-Identifier: BSD-3-clause

set -e
set -o errexit
set -o pipefail
set -o nounset

function version_gt() {
    test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1";
}

function cleanup() {
    local tmpdir=$1
    if [ -n "$(ls -A ${tmpdir})" ]; then
        rm -r "${tmpdir:?}"/*
    fi
    rmdir "${tmpdir}"

}

function update() {
    local tarball_url=$1
    local gpg_url=$2
    local tempdir=$3
    local destination=$4

    tarball_file=$(basename "${tarball_url}")
    gpg_file=$(basename "${gpg_url}")

    pushd "${tempdir}"
    echo "Downloading..."
    /usr/bin/curl -L -O "${tarball_url}"
    /usr/bin/curl -L -O "${gpg_url}"

    # GPG key of project
    echo "Verifying the archive integrity..."
    /usr/bin/curl -s -O "https://github.com/RiotRobot.gpg"
    /usr/bin/gpg -o RiotRobot.ring --dearmor RiotRobot.gpg
    /usr/bin/gpg --no-default-keyring --keyring ./RiotRobot.ring --verify "${gpg_file}"

    echo "Extracting archive..."
    tar xfv "${tarball_file}"
    folder_name=$(basename "${tarball_file}" .tar.gz)
    # Update Element, but don't destroy the existing configuration
    echo "Copying new files..."
    /usr/bin/rsync -rXH "${folder_name}/" "${destination}/" \
        --delete \
        --exclude config.json \
        --chown "${WEB_USER}":"${WEB_USER}"
    chown -R "${WEB_USER}":"${WEB_USER}" "${destination}"
    echo "Update complete."
    popd
}

tmpdir=$(mktemp -d)

trap 'cleanup ${tmpdir}' EXIT

HOMESERVER_URL="https://chat.dennogumi.org"
DESTINATION_PATH="/srv/www/htdocs/chat.dennogumi.org"
WEB_USER="nginx"
github_data=$(/usr/bin/curl -s https://api.github.com/repos/vector-im/element-web/releases/latest)

current_version=$(/usr/bin/curl -s "${HOMESERVER_URL}/version")
remote_version=$(echo "${github_data}" | /usr/bin/jq -r '.name')

echo "Checking for version updates..."

if version_gt "${remote_version}" "v${current_version}"
then
    echo "New version found: ${remote_version}"
    changelog=$(echo "${github_data}" | /usr/bin/jq -r '.body')
    echo "Changes in this version:"
    echo "${changelog}"
    asset_name=$(echo "${github_data}" | /usr/bin/jq -r '.assets[] |
            select(.browser_download_url|endswith("tar.gz")) |
            select(.name|startswith("element")).browser_download_url')
    gpg_key_name=$(
        echo "${github_data}" | /usr/bin/jq -r '.assets[] |
            select(.browser_download_url|endswith("asc")) |
            select(.name|startswith("element")).browser_download_url')
    echo "Updating Element.im from ${current_version} to ${remote_version}..."
    update "${asset_name}" "${gpg_key_name}" "${tmpdir}" "${DESTINATION_PATH}"
else
    echo "No new update: nothing to do."
fi

exit 0