#!/usr/bin/env bash

set -euo pipefail

repository="kkutsner/kterm"

if (( $# > 1 )); then
    echo "Usage: kterm-update [VERSION]" >&2
    exit 2
fi

case "$(uname -m)" in
    x86_64)
        debian_architecture="amd64"
        rpm_architecture="x86_64"
        ;;
    aarch64)
        debian_architecture="arm64"
        rpm_architecture="aarch64"
        ;;
    *)
        echo "kterm-update: unsupported architecture: $(uname -m)" >&2
        exit 1
        ;;
esac

if ! command -v curl >/dev/null 2>&1; then
    echo "kterm-update: curl is required." >&2
    exit 1
fi

if command -v dnf >/dev/null 2>&1; then
    asset_architecture="$rpm_architecture"
    asset_extension="rpm"
    installer=(dnf install --assumeyes)
elif command -v apt-get >/dev/null 2>&1; then
    asset_architecture="$debian_architecture"
    asset_extension="deb"
    installer=(apt-get install --yes)
else
    echo "kterm-update: only Fedora and Debian/Ubuntu are supported." >&2
    exit 1
fi

if (( $# == 1 )); then
    version="${1#v}"
    if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
        echo "kterm-update: invalid version: $1" >&2
        exit 2
    fi
    tag="v$version"
else
    latest_url="$(
        curl \
            --fail \
            --location \
            --output /dev/null \
            --silent \
            --show-error \
            --write-out '%{url_effective}' \
            "https://github.com/$repository/releases/latest"
    )"
    tag="${latest_url##*/}"
    version="${tag#v}"
    if [[ "$tag" != "v$version" || ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
        echo "kterm-update: could not determine the latest release." >&2
        exit 1
    fi
fi

case "$asset_extension" in
    deb)
        asset="kterm_${version}_${asset_architecture}.deb"
        ;;
    rpm)
        asset="kterm-${version}-1.${asset_architecture}.rpm"
        ;;
esac

workdir="$(mktemp -d)"
trap 'rm -rf "$workdir"' EXIT

release_url="https://github.com/$repository/releases/download/$tag"
curl \
    --fail \
    --location \
    --output "$workdir/$asset" \
    --silent \
    --show-error \
    "$release_url/$asset"
curl \
    --fail \
    --location \
    --output "$workdir/$asset.sha256" \
    --silent \
    --show-error \
    "$release_url/$asset.sha256"

(
    cd "$workdir"
    sha256sum --check "$asset.sha256"
)

if (( EUID != 0 )); then
    if ! command -v sudo >/dev/null 2>&1; then
        echo "kterm-update: run as root or install sudo." >&2
        exit 1
    fi
    installer=(sudo "${installer[@]}")
fi

"${installer[@]}" "$workdir/$asset"
