#! /usr/bin/env bash

set -eu

cleanup() {
    echo "Removing the temporary directory: $XONE_TMP"
    rm -rf "$XONE_TMP"
}

XONE_TMP=$(mktemp -d)

trap "cleanup" EXIT

fatal () {
    echo "ERROR: $@"
    exit 1
}

if [ "$(id -u)" -ne 0 ]; then
    echo 'This script must be run as root!' >&2
    exit 1
fi

if ! [ -x "$(command -v curl)" ]; then
    echo 'This script requires curl!' >&2
    exit 1
fi

if ! [ -x "$(command -v bsdtar)" ]; then
    echo 'This script requires bsdtar!' >&2
    exit 1
fi

if [ "${1:-}" != --skip-disclaimer ]; then
    echo "The firmware for the wireless dongle is subject to Microsoft's Terms of Use:"
    echo 'https://www.microsoft.com/en-us/legal/terms-of-use'
    echo
    echo 'Press enter to continue!'
    read -r _
fi

echo -e "Dongle firmware installation\n"

urls=(
    'https://catalog.s.download.windowsupdate.com/d/msdownload/update/driver/drvs/2017/03/2ea9591b-f751-442c-80ce-8f4692cdc67b_6b555a3a288153cf04aec6e03cba360afe2fce34.cab'
    'https://catalog.s.download.windowsupdate.com/c/msdownload/update/driver/drvs/2017/07/1cd6a87c-623f-4407-a52d-c31be49e925c_e19f60808bdcbfbd3c3df6be3e71ffc52e43261e.cab'
    'https://catalog.s.download.windowsupdate.com/c/msdownload/update/driver/drvs/2017/06/1dbd7cb4-53bc-4857-a5b0-5955c8acaf71_9081931e7d664429a93ffda0db41b7545b7ac257.cab'
    'https://catalog.s.download.windowsupdate.com/d/msdownload/update/driver/drvs/2017/08/aeff215c-3bc4-4d36-a3ea-e14bfa8fa9d2_e58550c4f74a27e51e5cb6868b10ff633fa77164.cab'
)
hashes=(
    '080ce4091e53a4ef3e5fe29939f51fd91f46d6a88be6d67eb6e99a5723b3a223'
    '48084d9fa53b9bb04358f3bb127b7495dc8f7bb0b3ca1437bd24ef2b6eabdf66'
    '0023a7bae02974834500c665a281e25b1ba52c9226c84989f9084fa5ce591d9b'
    'e2710daf81e7b36d35985348f68a81d18bc537a2b0c508ffdfde6ac3eae1bad7'
)
filenames=('FW_ACC_00U.bin' 'FW_ACC_00U.bin' 'FW_ACC_CL.bin' 'FW_ACC_BR.bin')
pids=('02e6' '02fe' '02f9' '091e')

function download_firmware() {
    cd "$XONE_TMP"
    local firmware_name="xone_dongle_${1}.bin"
    local dest_file="/lib/firmware/$firmware_name"

    if [[ -f $dest_file ]]; then
        echo -e "$firmware_name found. Skipping download"
        return 0
    fi

    echo -n "Downloading $firmware_name..."
    curl -s -L -o driver.cab "$2" || fatal "download $2"
    bsdtar -xf driver.cab "$3" > /dev/null 2>&1

    echo -n " Checking sha256..."
    echo "$4" "$3" | sha256sum -c --quiet || fatal "hash sum mismatch"
    mv "$3" $dest_file
    rm driver.cab

    echo -e " Done!"
}

for ((i = 0 ; i < "${#urls[@]}" ; i++)); do
    download_firmware "${pids[$i]}" "${urls[$i]}" "${filenames[$i]}" "${hashes[$i]}"
done

echo -e "\nDongle firmwares installed!"

