#!/bin/bash

version="0.2.6"
reldate="2026/11/03"

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 -"

mscorefonts_path=/usr/share/fonts/truetype/msfonts/

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
}

fonts_installed () {
    if [ -d ${mscorefonts_path} ]; then
        echo "installed"
        return 0
    else
        echo "not installed"
        return 1
    fi
}

installed_version () {
    dpkg-query --show --showformat='${Version}' "${1}" 2>/dev/null || echo "---"
}

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
}


install_corefonts () {
    pkg_file="$(basename "${mscorefonts_url}")"
    download_package "${mscorefonts_url}" "mscorefonts" "${mscorefonts_sha}" "${pkg_file}"

    if [[ "${noinst}" = "false" ]]; then
        tar -xf "${pkg_base}/${pkg_file}" -C "${pkg_base}"
        cd "${pkg_base}/msfonts/"
        for exe in *.exe; do
            cabextract -q -L -F '*.ttf' "${exe}"
        done

        echo "installing Microsoft Core Fonts"
        mkdir -p "${mscorefonts_path}"

        for font in *.ttf; do
            install -m644 "${font}" "${mscorefonts_path}"
        done

        cd "${pkg_base}"
        rm -rf msfonts

        echo "updating font cache"
        fc-cache -f
    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 | webex-vdi )
                install_helper "${pkg}" true
            ;;
            mscorefonts )
                install_corefonts
            ;;
            * )
                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"
        citrix_lcl="---"
        #citrix_beta_lcl="---"
        citrix_usb_lcl="---"
        #citrix_usb_beta_lcl="---"

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

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

        echo "${scriptname} supports the following packages (local version/latest version)"
        echo "
zoom:               + [$(is_installed ${zoom_bin})]         + $(installed_version ${zoom_bin})/${zoom_ver}
zoom-vdi:           + [$(is_installed ${zoom_vdi_bin})]     + $(installed_version ${zoom_vdi_bin})/${zoom_vdi_ver}
webex-vdi:          + [$(is_installed ${webex_vdi_bin})]    + $(installed_version ${webex_vdi_bin})/${webex_vdi_ver}
citrix:             + [${citrix_inst}]                      + ${citrix_lcl}/${citrix_ver}
citrix-usb:         + [${citrix_usb_inst}]                  + ${citrix_usb_lcl}/${citrix_usb_ver}
citrix-epa:         + [$(is_installed ${citrix_epa_bin})]   + $(installed_version ${citrix_epa_bin})/${citrix_epa_ver}
mscorefonts:        + [$(fonts_installed)]                  +
" | column -t -s"+"
#citrix-beta:        + [${citrix_beta_inst}]                 + ${citrix_beta_lcl}/${citrix_beta_ver}
#citrix-beta-usb:    + [${citrix_usb_beta_inst}]             + ${citrix_usb_beta_lcl}/${citrix_beta_usb_ver}
    ;;

    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 and their status
    ${scriptname} download       only download desired package
    ${scriptname} install        download and install desired package
    ${scriptname} clear          clear temporary download directory
    ${scriptname} version        print version
"
    ;;
esac
