#!/bin/bash

CWD=$(dirname "$(readlink -m "${BASH_SOURCE[0]}")")
PREFIX=${PREFIX:-/usr}

_deb_version=$(sed -n '1s/.*(\([^)]*\)).*/\1/p' "${CWD}/debian/changelog")
if [[ ${_deb_version} =~ :([0-9.]+)\.([0-9]{8})- ]]; then
    version="${BASH_REMATCH[1]}"
    builddate="${BASH_REMATCH[2]}"
else
    _tag=$(git describe --tags --abbrev=0)
    version="${_tag//*-}"
    builddate="$(date +%Y%m%d)"
fi
codename=Equinox

dirs=(/etc/dracut.conf.d/
 /etc/fastfetch/
 /etc/kmscon/
 /etc/xdg/
 ${PREFIX}/bin/
 ${PREFIX}/lib/
 ${PREFIX}/sbin/
 ${PREFIX}/share/applications/
 ${PREFIX}/share/bash-completion/completions/
 ${PREFIX}/share/nanolx/skel/bin
 ${PREFIX}/share/nanolx/sources.d/
 ${PREFIX}/share/nanolx/apt.d/
 ${PREFIX}/share/man/man1/
 ${PREFIX}/share/cockpit/branding/nanolx/
 ${PREFIX}/share/pixmaps)

BIN_SCRIPTS=(hugo-push
 nanolx-gtksettings-kde
 repokit)
SBIN_SCRIPTS=(nanolx-apt
 nanolx-apt-hook
 nanolx-backup
 nanolx-backup-helper-usb
 nanolx-ctx
 nanolx-orbit
 nanolx-pam-yubikey
 nanolx-refind
 nanolx-skel)
SCRIPTS_CONF=(citrix_hdx_config.json
 config.pl
 hugo-push.conf
 nanolx-apt.conf
 nanolx-backup-usb.rules
 nanolx-backup-usb.service
 nanolx-backup.service
 nanolx-backup.timer
 nanolx-orbit.conf
 repokit.conf
 yubikey-lock.rules)
BRANDING_FILES=(branding.css
favicon.ico
logo-large.png
logo.png)
ETC_FILES=(issue
issue.net
motd)
DIST_FILES=(Nanolx.knsv
 pulseaudio-dummy)
SKEL_CONF=(bash_logout
 bashrc
 bashstyle.custom
 conkyrc
 profile)
SKEL_BIN=(conky-on-second-screen)
APT_SOURCES=(debian
 deb-multimedia
 i2p
 liquorix
 mozilla
 nanolx
 winehq)
APT_CONF=(99-keep-refind
 99-list-new
 99-nanolx
 pinning)

create_dirs () {
    for dir in "${dirs[@]}"; do
        mkdir -p "${DESTDIR}${dir}"
    done
}

install () {
    case "${3}" in
        /* )    local dest="${DESTDIR}${3}" ;;
        *  )    local dest="${DESTDIR}${PREFIX}/${3}" ;;
    esac

    case "${2}" in
        /* )    local in="${2}" ;;
        *  )    local in="${CWD}/${2}" ;;
    esac

    case "${1}" in
        data )  cp "${in}" "${dest}/$(basename "${2}")" ;;
        bin  )  cp "${in}" "${dest}/$(basename "${2}")"
                chmod +x "${dest}/$(basename "${2}")" ;;
        dir  )  cp -r "${in}" "${dest}/" ;;
    esac
}

install_scripts () {
    for script in "${BIN_SCRIPTS[@]}"; do
        install bin "${CWD}/scripts/${script}" bin/
    done
    for script in "${SBIN_SCRIPTS[@]}"; do
        install bin "${CWD}/scripts/${script}" sbin/
    done
    for script in "${BIN_SCRIPTS[@]}" "${SBIN_SCRIPTS[@]}"; do
        if [ -f "${CWD}/man/${script}.1" ]; then
            gzip "${CWD}/man/${script}.1" -c > "${CWD}/man/${script}.1.gz"
            install data "${CWD}/man/${script}.1.gz" share/man/man1/
        fi
        if [ -f "${CWD}/completion/${script}" ]; then
            install data "${CWD}/completion/${script}" share/bash-completion/completions/
        fi
    done
}

install_scripts_conf () {
    for conf in "${SCRIPTS_CONF[@]}"; do
        install data "${CWD}/conf/${conf}" share/nanolx/
    done
}

install_skel () {
    for conf in "${SKEL_CONF[@]}"; do
        install data "${CWD}/skel/.${conf}" share/nanolx/skel/
    done
    for bin in "${SKEL_BIN[@]}"; do
        install bin "${CWD}/skel/bin/${bin}" share/nanolx/skel/bin/
    done
    install data "${CWD}/dist/bashstyle-ng_vendor.ini" /etc/
}

install_apt () {
    for source in "${APT_SOURCES[@]}"; do
        install data "${CWD}/apt/${source}.sources" share/nanolx/sources.d/
    done
    for conf in "${APT_CONF[@]}"; do
        install data "${CWD}/apt/${conf}" share/nanolx/apt.d/
    done
}

install_dist () {
    install data "${CWD}/dist/fonts.conf" /etc/dracut.conf.d/
    install data "${CWD}/dist/cockpit.desktop" share/applications/
    install data "${CWD}/dist/nanolx-logo.png" share/pixmaps/

    for dist in "${DIST_FILES[@]}"; do
        install data "${CWD}/dist/${dist}" share/nanolx/
    done
}

install_release () {
    # disguise our Debian as Nanolx
    for file in os-release kcm-about-distrorc issue issue.net; do
        cp "${CWD}/dist/${file}.in" "${CWD}/dist/${file}"
        sed -e "s/@VERSION@/${version}/g;s/@BUILDDATE@/${builddate}/g;s/@CODENAME@/${codename}/g" -i \
            "${CWD}/dist/${file}"
    done

    install data "${CWD}/dist/os-release" lib/
    install data "${CWD}/dist/kcm-about-distrorc" /etc/xdg/
    install data "${CWD}/dist/config.jsonc" /etc/fastfetch/
    install data "${CWD}/dist/kmscon.conf" /etc/kmscon/

    for conf in "${ETC_FILES[@]}"; do
        install data "${CWD}/dist/${conf}" /etc/
    done

    # branding for cockpit
    for file in "${BRANDING_FILES[@]}"; do
        install data "${CWD}/dist/${file}" share/cockpit/branding/nanolx/
    done
}

case "${1}" in
    install)
        create_dirs
        install_scripts
        install_scripts_conf
        install_skel
        install_apt
        install_dist
    ;;
    install-release)
        install_release
    ;;
    uninstall)
        echo "nothing yet"
    ;;
    updateconf)
        install_scripts_conf
    ;;
    scripts)
        install_scripts
        install_scripts_conf
    ;;
    clean )
        rm -f "${CWD}/man"/*.1.gz
        rm -f "${CWD}/dist/issue"
        rm -f "${CWD}/dist/issue.net"
        rm -f "${CWD}/dist/os-release"
        rm -f "${CWD}/dist/kcm-about-distrorc"
    ;;
    * )
        echo "
Nanolx (${version} ${builddate}) install script

usage:

[./]make clean      - clean up
[./]make install    - install everything
[./]make scripts    - only install scripts + config
[./]make updateconf - only install config
"
    ;;
esac
