#!/bin/sh
# eXeLearning installer for Linux and macOS.
# Usage: curl -fsSL https://get.exelearning.dev | sh
set -e

REPO="exelearning/exelearning"
API="https://api.github.com/repos/$REPO/releases/latest"

err()  { printf '\033[1;31merror:\033[0m %s\n' "$*" >&2; exit 1; }
info() { printf '\033[1;34m==>\033[0m %s\n' "$*"; }
need() { command -v "$1" >/dev/null 2>&1 || err "missing dependency: $1"; }

need curl

OS="$(uname -s)"
ARCH="$(uname -m)"

case "$OS" in
    Linux)
        if [ "$ARCH" != "x86_64" ] && [ "$ARCH" != "amd64" ]; then
            err "unsupported architecture: $ARCH (only x86_64/amd64 builds are published)"
        fi
        if command -v apt-get >/dev/null 2>&1; then
            kind=deb
        elif command -v dnf >/dev/null 2>&1 || command -v yum >/dev/null 2>&1 || command -v rpm >/dev/null 2>&1; then
            kind=rpm
        else
            err "no supported package manager (apt-get, dnf, yum, rpm) found"
        fi
        ;;
    Darwin)
        kind=dmg
        ;;
    *)
        err "unsupported OS: $OS"
        ;;
esac

info "Querying latest release"
asset_url=$(curl -fsSL "$API" | awk -v kind="$kind" '
    BEGIN { FS = "\"" }
    /"browser_download_url"/ {
        url = $4
        if (kind == "deb" && url ~ /_amd64\.deb$/)   { print url; exit }
        if (kind == "rpm" && url ~ /\.x86_64\.rpm$/) { print url; exit }
        if (kind == "dmg" && url ~ /universal\.dmg$/) { print url; exit }
    }
')

[ -n "$asset_url" ] || err "could not find a $kind asset in the latest release"

tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT
filename=$(basename "$asset_url")

info "Downloading $filename"
curl -fL --progress-bar -o "$tmpdir/$filename" "$asset_url"

case "$kind" in
    deb)
        info "Installing $filename"
        if command -v sudo >/dev/null 2>&1; then SUDO=sudo; else SUDO=; fi
        $SUDO apt-get install -y "$tmpdir/$filename" \
            || $SUDO dpkg -i "$tmpdir/$filename" \
            || err "failed to install $filename"
        ;;
    rpm)
        info "Installing $filename"
        if command -v sudo >/dev/null 2>&1; then SUDO=sudo; else SUDO=; fi
        if command -v dnf >/dev/null 2>&1; then
            $SUDO dnf install -y "$tmpdir/$filename"
        elif command -v yum >/dev/null 2>&1; then
            $SUDO yum install -y "$tmpdir/$filename"
        else
            $SUDO rpm -Uvh "$tmpdir/$filename"
        fi
        ;;
    dmg)
        info "Mounting $filename"
        mountpoint=$(hdiutil attach -nobrowse -readonly "$tmpdir/$filename" | awk -F'\t' 'END{print $NF}' | sed 's/^ *//')
        [ -n "$mountpoint" ] || err "failed to mount $filename"
        app=$(find "$mountpoint" -maxdepth 1 -name "*.app" -print -quit)
        if [ -z "$app" ]; then
            hdiutil detach "$mountpoint" >/dev/null 2>&1 || true
            err "no .app bundle inside DMG"
        fi
        target="/Applications/$(basename "$app")"
        info "Copying $(basename "$app") to /Applications"
        if command -v sudo >/dev/null 2>&1; then SUDO=sudo; else SUDO=; fi
        $SUDO rm -rf "$target"
        $SUDO cp -R "$app" /Applications/
        hdiutil detach "$mountpoint" >/dev/null
        ;;
esac

info "Done. Launch eXeLearning from your applications menu."
