#!/bin/bash

version="0.2.3"
reldate="2026/09/14"

if (( EUID != 0 )); then
    echo "${scriptname} must be run as root"
    exit 1
fi

scriptname=$(basename ${0})

pkg_base="/var/cache/nanolx"
mkdir -p "${pkg_base}"

source /usr/share/nanolx/${scriptname}.conf

curl_opts="-L --progress-bar -C -"

check_sha256 () {
    local checksum="${1}"
    local file="${2}"

    if ! echo "${checksum}" "${file}" | sha256sum -c &>/dev/null; then
        echo "SHA256 checksum for ${file} is wrong"
        rm "${file}"
        noinst=true
    else
        echo "SHA256 checksum for ${file} is correct"
    fi
}

check_modern_citrix () {
    ICAROOT=/opt/Citrix/ICAClient
    ICA_VER=$(${ICAROOT}/wfica -version | awk '/Version/{print $2}')
    ICA_VER=${ICA_VER%.*}
    ICA_VER=${ICA_VER//./}
    if [ ${ICA_VER} -ge 26040 ]; then
        is_webkitgtk41=$(ldd "${ICAROOT}/selfservice" | awk '/libwebkit2gtk-4.1/')
        if [ -z "${is_webkitgtk41}" ]; then
            return 1
        else
            return 0
        fi
    else
        return 1
    fi
}

is_installed () {
    if dpkg-query --show --showformat='${Status}' "${1}" 2>/dev/null | \
        grep -q "^install ok"; then
        echo "installed"
        return 0
    else
        echo "not installed"
        return 1
    fi
}

download_package () {
    url="${1}"
    pkg="${2}"
    sha="${3}"

    if [ -z "${5}" ]; then
        download="${pkg_base}/${4}"
        final_out="${pkg_base}/${4}"
    else
        download="${pkg_base}/${4}"
        final_out="${pkg_base}/${5}"
    fi

    if [ -f "${final_out}" ]; then
        echo -e "\nPackage ${pkg} (${final_out}) already downloaded, verifying"
    else
        echo -e "\nDownloading ${pkg}: (${final_out})"
        case "${download}" in
            *.zip )
                curl ${curl_opts} "${url}" | bsdtar -xf- --no-same-permissions -C "${pkg_base}/"
            ;;
            * )
                curl ${curl_opts} -o "${download}" "${url}"
            ;;
        esac
    fi

    check_sha256 "${sha}" "${final_out}"
}

install_package () {
    pkg="${pkg_base}/${1}"

    if [[ "${mode}" = "in" ]]; then
        if [[ "${noinst}" = "false" ]]; then
            gdebi -nq "${pkg}"
        else
            echo "not installing ${pkg} due to wrong SHA256 checksum"
        fi
    fi
}

install_helper () {
    local name="${1}"

    local -n url="${name//-/_}_url"
    local -n sha="${name//-/_}_sha"
    if [ -z "${2}" ]; then
        local filename="${url##*/}"
    else
        local -n filename="${name//-/_}_pkg"
    fi
    local -n unzip_filename="${name//-/_}_pkg2"

    download_package "${url}" "${name}" "${sha}" "${filename}" "${unzip_filename}"
    if [ -z "${unzip_filename}" ]; then
        install_package "${filename}"
    else
        install_package "${unzip_filename}"
    fi
}


handle_packages () {
    mode="${1}"
    shift

    for pkg in "${@}"; do
        noinst=false
        case ${pkg} in
            zoom-vdi )
                install_helper "${pkg}"
            ;;
            zoom | citrix | citrix-usb | citrix-epa | citrix-beta | citrix-beta-usb | webex-vdi )
                install_helper "${pkg}" true
            ;;
            * )
                echo "package ${pkg} unknown"
            ;;
        esac
    done
}

user_opt="${1}"
shift

case ${user_opt} in
    download )
        if [[ -z "${@}" ]]; then
            echo "no packages specified, exit."
            exit 0
        else
            handle_packages dl "${@}"
        fi
    ;;

    install )
        if [[ -z "${@}" ]]; then
            echo "no packages specified, exit."
            exit 0
        else
            handle_packages in "${@}"
        fi
    ;;

    list )
        citrix_inst="not installed"
        citrix_beta_inst="not installed"
        citrix_usb_inst="not installed"
        citrix_usb_beta_inst="not installed"

        if $(is_installed ${citrix_bin} &>/dev/null); then
            if check_modern_citrix; then
                citrix_beta_inst="installed"
            else
                citrix_inst="installed"
            fi
        fi

        if $(is_installed ${citrix_usb_bin} &>/dev/null); then
            if check_modern_citrix; then
                citrix_usb_beta_inst="installed"
            else
                citrix_usb_inst="installed"
            fi
        fi

        echo "${scriptname} supports the following packages:"
        echo "
zoom:               + [$(is_installed ${zoom_bin})]         + ${zoom_url##*/} (${zoom_ver})
zoom-vdi:           + [$(is_installed ${zoom_vdi_bin})]     + ${zoom_vdi_url##*/}
webex-vdi:          + [$(is_installed ${webex_vdi_bin})]    + ${webex_vdi_pkg2}
citrix:             + [${citrix_inst}]                      + ${citrix_pkg}
citrix-usb:         + [${citrix_usb_inst}]                  + ${citrix_usb_pkg}
citrix-epa:         + [$(is_installed ${citrix_epa_bin})]   + ${citrix_epa_pkg}
citrix-beta:        + [${citrix_beta_inst}]                 + ${citrix_beta_pkg}
citrix-beta-usb:    + [${citrix_usb_beta_inst}]             + ${citrix_beta_usb_pkg}
" | column -t -s"+"
    echo "Note: citrix stable and beta share the same package name, so both appear un/installed!
"
    ;;

    clear )
        echo "removing downloaded packages from ${pkg_base}"
        rm -fv "${pkg_base}"/*
    ;;

    version)
        echo "${scriptname} ${version} (${reldate})"
    ;;

    help | * )
        echo -e "${scriptname} v${version} (${reldate})
© 2026 Christopher Roy Bratusek <nano@jpberlin.de>

licensed under the GNU General Public License v3 (or newer)

usage:
    ${scriptname} list           list available packages
    ${scriptname} download       only download desired package
    ${scriptname} install        download and install desired package
    ${scriptname} clear          clear temporary download directory
    ${scriptname} version        print version
"
    ;;
esac
