#!/bin/sh

# CREDITS: https://github.com/MidnightRocket/posix-colors
if [ -z "${NO_COLOR+x}" ] && { [ -t 1 ] && [ -t 2 ] || [ -n "${CLICOLOR_FORCE+x}" ];} ; then readonly T_USE_COLOR=true; else unset T_USE_COLOR; fi

T_ESC="\033[" # ¯\_(ツ)_/¯
readonly T_ESC="${T_USE_COLOR+"$T_ESC"}"

readonly TR="${T_ESC}${T_USE_COLOR+"0m"}"
readonly TR_F="${T_ESC}${T_USE_COLOR+"39m"}"               TR_B="${T_ESC}${T_USE_COLOR+"49m"}"

readonly TF_BLACK="${T_ESC}${T_USE_COLOR+"30m"}"           TF_WHITE="${T_ESC}${T_USE_COLOR+"97m"}"
readonly TF_RED="${T_ESC}${T_USE_COLOR+"31m"}"             TF_BRIGHT_RED="${T_ESC}${T_USE_COLOR+"91m"}"
readonly TF_GREEN="${T_ESC}${T_USE_COLOR+"32m"}"           TF_BRIGHT_GREEN="${T_ESC}${T_USE_COLOR+"92m"}"
readonly TF_YELLOW="${T_ESC}${T_USE_COLOR+"33m"}"          TF_BRIGHT_YELLOW="${T_ESC}${T_USE_COLOR+"93m"}"
readonly TF_BLUE="${T_ESC}${T_USE_COLOR+"34m"}"            TF_BRIGHT_BLUE="${T_ESC}${T_USE_COLOR+"94m"}"
readonly TF_MAGENTA="${T_ESC}${T_USE_COLOR+"35m"}"         TF_BRIGHT_MAGENTA="${T_ESC}${T_USE_COLOR+"95m"}"
readonly TF_CYAN="${T_ESC}${T_USE_COLOR+"36m"}"            TF_BRIGHT_CYAN="${T_ESC}${T_USE_COLOR+"96m"}"
readonly TF_DARK_GRAY="${T_ESC}${T_USE_COLOR+"90m"}"       TF_BRIGHT_GRAY="${T_ESC}${T_USE_COLOR+"37m"}"

print() { printf "%b%b" "${1-""}" "${2-"${TR}\\n"}"; }
stderr() { print "$@" 1>&2; }

if [ -f /etc/os-release ]; then
        . /etc/os-release
else
        print 'Операционная система не поддерживается.'
        exit 1
fi

packages=
type=
distrib="${VERSION_CODENAME}"

if [ $(id -u) -ne 0 ]; then
        print "${TF_BRIGHT_RED}Установка требует запуска с правами суперпользователя (root).${TR}"
        exit 1
fi

check_package_rpm()
{
        if rpm --quiet --query $1>/dev/null 2>&1; then
                retval='установлен'
                return 0
        else
                retval="${TF_WHITE}не установлен${TR}"
                return 1
        fi
}

check_package_deb()
{
        if dpkg-query -W -f='${Status}' $1>/dev/null 2>&1; then
                retval='установлен'
                return 0
        else
                retval="${TF_WHITE}не установлен${TR}"
                return 1
        fi
}

check_cryptopro()
{
        status=0
        print 'Проверка КриптоПро:'
        for pkg in lsb-cprocsp-base cprocsp-pki-cades-64 lsb-cprocsp-capilite-64 lsb-cprocsp-rdr-64; do
                if [ "$type" = 'apt' ]; then
                        check_package_deb $pkg
                        status=$((status+$?))
                else
                        check_package_rpm $pkg
                        status=$((status+$?))
                fi
                print "  пакет $pkg: $retval"
        done
        return $status
}

case "${ID}_${VERSION_ID}" in
        debian_12)
                print "Установка для ${TF_GREEN}Debian 12${TR} «Bookworm»"
                type=apt
                ;;
        ubuntu_20.04)
                print "Установка для ${TF_GREEN}Ubuntu 20.04${TR} «Focal Fossa»"
                type=apt
                ;;
        ubuntu_22.04)
                print "Установка для ${TF_GREEN}Ubuntu 22.04${TR} «Jammy Jellyfish»"
                type=apt
                ;;
        ubuntu_24.04)
                print "Установка для ${TF_GREEN}Ubuntu 24.04${TR} «Noble Numbat»"
                type=apt
                ;;
        astra_1.7_x86-64)
                print "Установка для ${TF_GREEN}Astra Linux Special Edition 1.7${TR} «Смоленск»"
                type=apt
                distrib=alse17
                packages='libkf5js5=5.78.0-0ubuntu2+alse17 libkf5jsapi5=5.78.0-0ubuntu2+alse17'
                ;;
        fedora_40)
                print "Установка для ${TF_GREEN}Fedora 40${TR}"
                type=dnf
                distrib=fedora
                ;;
        rosa_2021.1)
                print "Установка для ${TF_GREEN}Росы 2021.1${TR}"
                type=dnf
                distrib=rosa
                ;;
        redos_7.3*)
                print "Установка для ${TF_GREEN}РEД ОС 7.3${TR}"
                type=dnf
                distrib=redos
                ;;
        redos_8.0)
                print "Установка для ${TF_GREEN}РEД ОС 8${TR}"
                type=dnf
                distrib=redos
                ;;
        altlinux_10* | altlinux_p10)
                print "Установка для ${TF_GREEN}Альт 10${TR}"
                type=alt
                distrib=p10
                ;;
        altlinux_11* | altlinux_p11)
                print "Установка для ${TF_GREEN}Альт 11${TR}"
                type=alt
                distrib=p11
                ;;
        *)
                print "Операционная система «$PRETTY_NAME» ${TF_BRIGHT_REF}не поддерживается.${TR}"
                exit 1
                ;;
esac

if check_cryptopro; then
        packages="$packages okular-csp"
else
        packages="$packages okular-gost"
        print "${TF_BRIGHT_RED}КриптоПро не установлен.${TR} Окуляр ГОСТ будет установлен без модуля КриптоПро."
        print 'После установки недостающих пакетов вы можете перезапустить установку.'
fi

set -e

# Установка плагинов dnf для РЕД ОС.
if [ "$distrib" = 'redos' ]; then
        dnf install -y dnf-plugins-core
fi

if [ "$type" = 'apt' ]; then
        echo "deb http://packages.lab50.net/okular $distrib main non-free" > /etc/apt/sources.list.d/okulargost.list
        if [ ! -f /etc/apt/trusted.gpg.d/lab50.gpg ]; then
                wget -q -O /etc/apt/trusted.gpg.d/lab50.gpg http://packages.lab50.net/lab50.gpg > /dev/null
                chmod 0644 /etc/apt/trusted.gpg.d/lab50.gpg
        fi
        apt-get update > /dev/null
        apt-get install -y $packages
elif [ "$type" = 'dnf' ]; then
        dnf config-manager --add-repo http://packages.lab50.net/okular/$distrib/okularcsp.repo
        dnf install -y $packages
else
        echo "rpm http://packages.lab50.net/okular/alt $distrib/x86_64 okulargost" > /etc/apt/sources.list.d/okulargost.list
        apt-get update > /dev/null
        apt-get install -y $packages
fi

print "${TF_WHITE}Окуляр ГОСТ успешно установлен.${TR}"
