#!/bin/sh

# MIT License
#
# Copyright (c) 2020 veleth
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

# get variable by name stored in other variable
deref() {
    eval echo "\$$1"
}

# get Nth string of a variable
elem() {
    # shellcheck disable=SC2059 # the only way
    printf "$2" | sed "$1!d"
}

# help message
help() {
    printf "disfetch is a CLI system information tool written in bash

Usage: disfetch [options]
Options:
  -h\t\tprint this help
  -l <logo>\tset distro logo
  -m\t\tdon't use colors and formatting
  -n\t\tdisable decorations, display only info
    \n"
}

# parse arguments
while getopts "hl:mn" opt; do
    case "$opt" in
        h) help; exit 0;;
        l) LOGO="$OPTARG";;
        m) MONO=1;;
        n) INFO_ONLY=;;
        *) exit 1;;
    esac
done
shift $((OPTIND - 1))

###########################################
# global stuff needed everywhere          #
###########################################
if [ -z "$MONO" ]; then
    # all colors
    blue="\033[34m"
    brightblue="\033[94m"
    cyan="\033[36m"
    brightcyan="\033[96m"
    #black="\033[30m" unused?
    brightblack="\033[90m"
    red="\033[31m"
    brightred="\033[91m"
    yellow="\033[33m"
    brightyellow="\033[93m"
    magenta="\033[35m"
    brightmagenta="\033[95m"
    green="\033[32m"
    brightgreen="\033[92m"
    white="\033[37m"
    brightwhite="\033[97m"
    xx="\033[0m" # reset
    zz="\033[1m" # bold

    # system colors palette
    PALETTE="\033[37mW\033[97mE$xx
\033[31mR\033[91mD$xx
\033[32mG\033[92mN$xx
\033[33mY\033[93mW$xx
\033[34mB\033[94mE$xx
\033[35mM\033[95mA$xx
\033[36mC\033[96mN$xx
\033[30mB\033[90mK$xx"
fi

###########################################
# getting needed information              #
###########################################

# getting hostname
if [ -f /etc/hostname ]; then
    HOSTNAME=$(cat /etc/hostname)
else
    HOSTNAME=$(uname -n)
fi

# getting OS name
if [ -f /etc/os-release ]; then
    # shellcheck source=/dev/null
    OS="$(. /etc/os-release && echo "$PRETTY_NAME" |
        tr '[:upper:]' '[:lower:]')"
elif type lsb_release >/dev/null 2>&1; then
    OS="$(lsb_release -si | tr '[:upper:]' '[:lower:]')"
else
    OS="$(uname -o | tr '[:upper:]' '[:lower:]')"
fi

# getting kernel version
# shellcheck disable=SC2034 # actually used in eval
[ "$OS" != haiku ] &&
    KERNEL="$(uname -r | tr '[:upper:]' '[:lower:]')"

# getting kernel architecture
# shellcheck disable=SC2034 # actually used in eval
ARCH="$(uname -m | tr '[:upper:]' '[:lower:]')"

# finding out if OS has uptime with prerrifying option
# or hardcoding prettified uptime
# shellcheck disable=SC2034 # actually used in eval
UPTIME="$(
    if [ "$(uptime -p 2>/dev/null)" ]; then
        uptime -p | sed 's/up //; s/,//g'
    elif [ -f /proc/uptime ]; then
        awk '{
            uptime = $1;
            if (uptime >= 604800) {
                if (uptime >= 1209600) {
                    printf "%s weeks ", int(uptime/604800);
                } else {
                    printf "1 week ";
                }
            }
            if (uptime >= 86400) {
                if (int((uptime%604800)/86400) > 0) {
                    if (int((uptime%604800)/86400) >= 2) {
                        printf "%s days ", int((uptime%604800)/86400);
                    } else {
                        printf "1 day ";
                    }
                }
            }
            if (uptime >= 3600) {
                if (int((uptime%86400)/3600) > 0) {
                    if (int((uptime%86400)/3600) >= 2) {
                        printf "%s hours ", int((uptime%86400)/3600);
                    } else {
                        printf "1 hour ";
                    }
                }
            }
            if (uptime >= 60) {
                if (int((uptime%3600)/60) > 0) {
                    if (int((uptime%3600)/60) >= 2) {
                        printf "%s minutes ", int((uptime%3600)/60);
                    } else {
                        printf "1 minute ";
                    }
                }
            }
            if (uptime >= 1 && 59 >= uptime) {
                if (int(uptime%60) > 0) {
                    if (int(uptime%60) >= 2) {
                        printf "%s seconds", int(uptime%60);
                    } else {
                        printf "1 second";
                    }
                }
            }
        }' /proc/uptime | xargs
    else
        uptime | cut -f1 -d "," | sed -E -e 's/^[^,]*up *//' \
            -e 's/, *[[:digit:]]* users.*//; s/min/minutes/' \
            -e 's/([[:digit:]]+):0?([[:digit:]]+)/\1 hours \2 minutes/' |
            xargs
    fi
)"

# getting current shell name
# shellcheck disable=SC2034 # actually used in eval
SHELL="$(basename "$SHELL")"

# getting DE and WM
# trying XDG_CURRENT_DESKTOP, if it doesn't exists, use DESKTOP_SESSION
# DESKTOP_SESSION is a full path so removing garbage
# shellcheck disable=SC2034 # actually used in eval
DESKTOP="$(
    if [ "$OS" != haiku ]; then
        de=$(echo "${XDG_CURRENT_DESKTOP:-$DESKTOP_SESSION}" | awk -F/ '{ print tolower($NF) }')
        if [ "$de" ] && echo "$de" | grep -Fq "none" || [ -z "$de" ]; then
            if [ "$WAYLAND_DISPLAY" ]; then
                wm="$(pgrep -lox "cage.*|cardboard|dwl|enlightenment|grefsen|
                        |hikari|kwin|mutter|river|sway|velox|wayfire|waymonad|
                        |weston|wio" | cut -d' ' -f2)"
            else
                # firstly getting root window id (WM) and then getting WM name, ignoring unimportant stuff
                # some WM do not have proper set atoms like _NET_SUPPORTING_WM_CHECK and _NET_WM_NAME
                # this workaround allows to detect such WM
                wm_id=$(xprop -root -notype _NET_SUPPORTING_WM_CHECK 2>/dev/null) &&
                wm="$(xprop -id "${wm_id##* }" _NET_WM_NAME 2>/dev/null |
                            awk '{ print tolower($NF) }' | xargs)"

                [ "$wm" ] ||
                    wm=$(ps -eo comm= | grep -m 1 -o -e "2bwm"      \
                                                     -e "catwm"     \
                                                     -e "dwm"       \
                                                     -e "fvwm"      \
                                                     -e "monsterwm" \
                                                     -e "sowm"      \
                                                     -e "tinywm"    \
                                                     -e "wmaker"    \
                                                     -e "xmonad")
            fi
            echo "$wm"
        else
            echo "$de"
        fi
    fi
)"

###########################################
# defining distro logo and packages count #
###########################################
# note for nixos: display only current user installed packages
packages_apk() { apk info 2>/dev/null | wc -l; }
packages_dpkg() { dpkg -l 2>/dev/null | grep -c "^ii"; }
packages_haiku() { pkgman search -ia  2>/dev/null |
    awk 'FNR > 2 { print }' | wc -l; }
packages_nix() { nix-store -q --requisites ~/.nix-profile 2>/dev/null | wc -l; }
packages_pacman() { pacman -Qq 2>/dev/null | wc -l; }
packages_rpm() { rpm -qa 2>/dev/null | wc -l; }
packages_slack() { find /var/log/packages -mindepth 1 -maxdepth 1 2>/dev/null |
    wc -l; }
packages_xbps() { xbps-query -l 2>/dev/null | wc -l; }
packages_emerge() { find /var/db/pkg -mindepth 2 -maxdepth 2 2>/dev/null |
    wc -l; }

# shellcheck disable=SC2034 # actually used in eval
PACKAGES="$(
    case $OS in
        alpine*|postm*) packages_apk;;
        android*|astra*|*bian*|elementary*|*mint*|mx*|*ubuntu*|zorin*|kali*)
            packages_dpkg;;
        arc*|artix*|endeavour*|manjaro*|garuda*|msys2*|parabola*)
            packages_pacman;;
        fedora*|qubes*|cent*|redhat*|opensuse*) packages_rpm;;
        gentoo*) packages_emerge;;
        haiku*) packages_haiku;;
        nixos*) packages_nix;;
        slack*) packages_slack;;
        void*) packages_xbps;;
    esac
)"

# Bedrock linux workaround
if [ "$(brl 2>/dev/null)" ]; then
    LOGO=bedrock
    OS=$(brl version | tr '[:upper:]' '[:lower:]')
fi

IFS= # preserve leading and trailing whitespaces
case "${LOGO:-$OS}" in
    alpine*)
        motif="$blue"
        a="$blue"
        read -r LOGO <<EOF
     $a//AAAAAAAAAAA\\\\\\\\$xx   \n\
    $a//$xx             $a\\\\\\\\$xx  \n\
   $a//$xx    $zz<^>$xx        $a\\\\\\\\$xx \n\
  $a//$xx   $zz,</$xx $zz\>,,$zz<^>,$xx  $a\\\\\\\\$xx\n\
  $a\\\\\\\\$xx  $zz</$xx     $zz\>$xx   $zz\>$xx $a//$xx\n\
   $a\\\\\\\\$xx$zz</$xx $zz/\\\\$xx    $zz\>$xx   $zz\\\\$xx$a//$xx \n\
    $a\\\\\\\\$xx             $a//$xx  \n\
     $a\\\\\\\\AAAAAAAAAAA//$xx   \n
EOF
        ;;
    android*)
        motif="$brightgreen"
        a="$green$zz"
        read -r LOGO <<EOF
     $a\..../$xx   \n\
     ${a}d${xx}o${a}HH${xx}o${a}b$xx   \n\
    $a''''''''$xx  \n\
  $a.$xx ${a}GHHHHHHB$xx $a.$xx\n\
  ${a}H$xx ${a}H######H$xx ${a}H$xx\n\
  ${a}U$xx ${a}H######H$xx ${a}U$xx\n\
    ${a}GHHHHHHB$xx  \n\
      ${a}U$xx  ${a}U$xx    \n
EOF
        ;;
    astra*)
        motif="$brightblue"
        a="$blue$zz"
        read -r LOGO <<EOF
          $a.$xx        \n\
        $a.'$xx.$a'.$xx      \n\
  $a.....<$xx.$a:::$xx.$a>.....$xx\n\
   $a'<$xx,'$a:::::::$xx',$a>'$xx \n\
      $a<$xx,$a':::'$xx,$a>$xx    \n\
     $a<$xx,$a'$xx,$a>^<$xx,$a'$xx,$a>$xx   \n\
    $a<,>       <,>$xx  \n\
   $a\`             \`$xx \n
EOF
        ;;
    archbang*)
        motif="$brightblue"
        a="$blue"
        b="$brightwhite$zz"
        read -r LOGO <<EOF
        ${b}_____$xx    \n\
        ${b}IG#LI$xx    \n\
       $a/$xx${b}IMGBI$xx    \n\
      $a/,$xx$b\\\\l1k/$xx    \n\
     $a/,):$xx${b}IJl$xx$a,\\\\$xx   \n\
    $a/,yC}$xx$b,=,${xx}${a}U,\\\\$xx  \n\
   $a/,peZ$xx$b:BcK:$xx$a!,\\\\$xx \n\
  $a/LL."""$xx$b\`=\`$xx$a".JJ\\\\$xx\n
EOF
        ;;
    arco*)
        motif="$blue"
        a="$brightblue$zz"
        read -r LOGO <<EOF
         $a.$xx       \n\
        $a/y\\\\$xx      \n\
       $a/o^a\\\\$xx     \n\
      $a/b/ \\\\b\\\\$xx    \n\
     $a/b/   \\\\a\\\\$xx   \n\
    $a/i/     \\\\g\\\\$xx  \n\
   $a/z/  .___ \\\\w\\\\$xx \n\
  $a/x/      "TH\\\\c\\\\$xx\n
EOF
        ;;
    arc*)
        motif="$brightblue"
        a="$blue"
        b="$cyan"
        read -r LOGO <<EOF
         $a.$xx       \n\
        $a/^\\\\$xx      \n\
       $a/, ,\\\\$xx     \n\
      $a/, $b${zz}v$xx$a ,\\\\$xx    \n\
     $a/, $b$zz($xx $b$zz)$xx$a ,\\\\$xx   \n\
    $a/,$xx $a>   $a<$xx $a,\\\\$xx  \n\
   $a/.>$xx       $a<.\\\\$xx \n\
  $a/>$xx           $a<\\\\$xx\n
EOF
        ;;
    artix*)
        motif="$blue"
        a="$brightblue$zz"
        b="$blue"
        read -r LOGO <<EOF
         $b.$xx       \n\
        $b/$a#\\\\$xx      \n\
       $b/,$a+,\\\\$xx     \n\
        $b\`<${a}n,\\\\$xx    \n\
     $a/$xx$b,    $b\`$a,\\\\$xx   \n\
    $a/,hK$xx$b+>    $b,$xx  \n\
   $a/.b$xx${b}>\`    $b<H$a.\\\\$xx \n\
  $a/$xx$b>\`         $b\`<$a\\\\$xx\n
EOF
        ;;
    bedrock*)
        motif="$brightblack"
        a="$brightblack"
        b="$white$zz"
        read -r LOGO <<EOF
  $a=================$xx\n\
  $a==$xx$b\\\\\ \\\\\\\\$xx$a==========$xx\n\
  $a===$xx$b\\\\\ \\\\\\\\$xx$a=========$xx\n\
  $a====$xx$b\\\\\ \`<<>>>$xx$a====$xx\n\
  $a=====$xx$b\\\\\\\\$xx  ${a}__$xx  $b\\\\\\\\$xx$a==$xx\n\
  $a======$xx$b\\\\\     //$xx$a==$xx\n\
  $a=======$xx$b<<<<>>$xx$a====$xx\n\
  $a=================$xx\n
EOF
        ;;
    cent*)
        motif="$brightyellow"
        a="$green"
        b="$magenta"
        c="$yellow"
        d="$blue"
        read -r LOGO <<EOF
        $c$zz/-\\\\$xx      \n\
    ${a}F44N$xx $c$zz#$xx ${b}F11N$xx  \n\
    ${a}L44X$xx $c$zz#$xx ${b}L11X$xx  \n\
  $b$zz/_____$xx $xx~ $xx$d${zz}_____\\\\$xx\n\
  $b$zz\\\\"""""$xx $xx~ $xx$d${zz}"""""/$xx\n\
    ${d}F33N$xx $a$zz#$xx ${c}F22N$xx  \n\
    ${d}L33X$xx $a$zz#$xx ${c}L22X$xx  \n\
        $a$zz\-/$xx      \n
EOF
        ;;
    debian*)
        motif="$magenta"
        a="$brightmagenta$zz"
        read -r LOGO <<EOF
      $a,6tt6,$xx  \n\
    $a,6$xx      ${a}6$xx \n\
   ${a}6$xx    $a,6.$xx  ${a}6$xx\n\
  $a'6$xx   ${a}6$xx    ${a}6'$xx\n\
    ${a}6$xx   $a'6''$xx  \n\
    $a'6$xx        \n\
      $a'6$xx      \n\
        $a'6.$xx   \n
EOF
        ;;
    kali*)
        a="$blue"
        read -r LOGO <<EOF
  ${a}gggg$xx       \n\
      ${a}888$xx    \n\
  ${a}qqqq88888o$xx \n\
     ${a}88    ee$xx\n\
    ${a}88$xx       \n\
     ${a}88$xx      \n\
      ${a}888$xx    \n\
         ${a}888$xx \n
EOF
        ;;
    elementary*)
        motif="$brightcyan"
        a="$brightblue$zz"
        read -r LOGO <<EOF
        $a.,*,.$xx      \n\
     $a.'$xx eeeee$xx $a'.$xx   \n\
   $a.'$xx e$xx       e$xx $a'.$xx \n\
  ${a}4${xx} ,e_________e$xx  ${a}L$xx\n\
  ${a}V$xx  e"""""""""\`$xx  ${a}7$xx\n\
   $a\`,$xx e$xx       ,$xx $a,\`$xx \n\
     $a\`, ${xx}eeeee$xx $a,\`$xx   \n\
        $a\`'*'\`$xx      \n
EOF
        ;;
    endeavour*)
        motif="$brightblue"
        a="$brightyellow"
        b="$brightmagenta"
        read -r LOGO <<EOF
            $a,<\`$xx$b^<\\\\$xx     \n\
          $a,<@$xx$b,<$xx${a}E\\\\$xx$b%%\\\\.$xx   \n\
        $a,<@$xx$b,<$xx${a}ENDE\\\\$xx$b%%\\\\\\\\$xx  \n\
      $a,<@$xx$b,<$xx${a}ENDEAVO\\\\$xx$b%%\\\\\\\\$xx \n\
    $a,<@$xx$b,<$xx${a}ENDEAVOUR:D$xx$b%%\\\\\`$xx\n\
   $a.__$xx$b<$xx${a}____#####_,P$xx$b%%%%%%D$xx\n\
    $b<EFGJKX\`\`\`\`\`%%H%%_,P$xx \n\
  $b<-------------\`\`\`$xx    \n
EOF
        ;;
    fedora*)
        motif="$blue"
        a="$blue"
        read -r LOGO <<EOF
        $a.,*,.$xx      \n\
     $a.'$xx   $zz,fff$xx$a'.$xx   \n\
   $a.'$xx     ${zz}H$xx     $a'.$xx \n\
  ${a}4$xx   $zz....H....$xx   ${a}L$xx\n\
  ${a}h$xx   $zz\`\`\`\`H\`\`\`\`$xx   ${a}7$xx\n\
  ${a}h$xx       ${zz}H$xx     $a,\`$xx \n\
  ${a}c$xx    ${zz}fff'$xx   $a,\`$xx   \n\
   $a\`zxjklfo'\`$xx      \n
EOF
        ;;
    garuda*)
        motif="$brightred"
        a="$yellow"
        b="$brightyellow"
        c="$brightred$zz"
        read -r LOGO <<EOF
          $b<< << >> << >>$xx   \n\
        $b<<$xx     $a$zz<$xx        $c\\\\\\\\$xx \n\
      $b<<$xx     $a$zz< I:::::::::$xx$c\\\\\\\\$xx\n\
    $b<<$xx                     \n\
  $b<<$xx    $a$zz<<$xx  $b<<  <<  <<  <<.$xx\n\
   $c\\\\\\\\$xx    $a$zz\\\\\\  >>  >>  <<$xx $b>>$xx \n\
    $c\\\\\\\\$xx             $a$zz<<$xx $b>>$xx   \n\
     $c\\\\\\\\$xx $b\\\\\\ \\\\\\ // // //$xx     \n
EOF
        ;;
    gentoo*)
        motif="$brightmagenta"
        a="$magenta$zz"
        read -r LOGO <<EOF
     $a.ggg.$xx     \n\
   $a.dGGGGG\$b.$xx  \n\
   $a\$GGG( )GGGb$xx \n\
   ${a}Q\$GGGGGGGGG)$xx\n\
     $a'GGGGGGGP$xx \n\
    ${a}dGGGGG\$P'$xx  \n\
  $a\$\$GGGG\$P$xx     \n\
  $a\`qG\$\$P'$xx      \n
EOF
        ;;
    haiku*)
        motif="$brightyellow"
        a="$brightblue$zz"
        b="$blue$zz"
        c="$brightyellow"
        read -r LOGO <<EOF
                      $a, , m H$xx\n\
           $a,$xx ${b}v$xx $a''\` L$xx ${b}V$xx      $a/$xx\n\
  $a,      ?                 x$xx \n\
   $a=_ _=-,$xx              $b<$xx    \n\
           $a''K k s  \`\`$xx       \n\
  ${c}H   H   / \   I  K  /  U  U$xx\n\
  ${c}H H H  /=-=\  I  K++   U  U$xx\n\
  ${c}H   H  A   A  I  K  \   UU$xx \n
EOF
        ;;
    kubuntu*)
        motif="$brightwhite"
        a="$brightblue$zz"
        read -r LOGO <<EOF
       $a;\\\\.   ,/.$xx     \n\
        ${a}B>'-'<:;  .>.$xx\n\
   ${a}Y<.,        'GQ:'$xx \n\
  ${a}__j//$xx              \n\
  $a""z\\\\\\\\$xx              \n\
   ${a}L<'\`        ,JS:.$xx \n\
        ${a}U>,_,<:;  '>'$xx\n\
       $a;/'   "\\\\'$xx     \n
EOF
        ;;
    manjaro*)
        motif="$green"
        a="$green"
        read -r LOGO <<EOF
  ${a}[][][][][][]|$xx ${a}[][][]$xx\n\
  ${a}[][][][][][]|$xx ${a}[][][]$xx\n\
  ${a}[][][]"""""""$xx ${a}[][][]$xx\n\
  ${a}[][][]$xx ${a}[][][]$xx ${a}[][][]$xx\n\
  ${a}[][][]$xx ${a}[][][]$xx ${a}[][][]$xx\n\
  ${a}[][][]$xx ${a}[][][]$xx ${a}[][][]$xx\n\
  ${a}[][][]$xx ${a}[][][]$xx ${a}[][][]$xx\n\
  ${a}[][][]$xx ${a}[][][]$xx ${a}[][][]$xx\n
EOF
        ;;
    *mint*)
        motif="$brightgreen"
        a="$green$zz"
        read -r LOGO <<EOF
  ${a}MM$xx   $a.*^*..*^*.$xx \n\
  $a\$\$$xx  $a\$\$'$xx $a'\$\$'$xx $a'\$\$$xx\n\
  $a\$\$$xx  $a\$\$$xx   $a\$\$$xx   $a\$\$$xx\n\
  $a\$\$$xx  $a\$\$$xx   $a\$\$$xx   $a\$\$$xx\n\
  $a\$\$$xx  $a\$\$$xx   $a\$\$$xx   $a\$\$$xx\n\
  $a\$\$.$xx $a\`\`$xx   $a\`\`$xx  $a.\$\$$xx\n\
  $a'Q\$\$\$\$\$\$\$\$\$\$\$\$Q'$xx\n\
    $a\`\`\`\`\`\`\`\`\`\`\`\`$xx  \n
EOF
        ;;
    msys2*)
        motif="$brightyellow"
        a="$magenta"
        b="$brightyellow"
        c="$brightwhite$zz"
        d="$brightblack$zz"
        read -r LOGO <<EOF
  $a/* * * * * * * * * * * */$xx\n\
  $a//$xx    ${c}mWm$xx   ${c}c2c$xx ${b}___    $a//$xx\n\
  $a//$xx   ${c}G   G Z  2$xx$b(__ \\\\$xx   $a//$xx\n\
  $a//$xx  ${c}K     H$xx     $b/ _/$xx   $a//$xx\n\
  $a//$xx  ${c}I     T$xx    $b(____)$xx  $a//$xx\n\
  $a//$xx  ${c}A     v     P$xx      $a//$xx\n\
  $a//$xx           ${d}S Y S$xx     $a//$xx\n\
  $a/* * * * * * * * * * * */$xx\n
EOF
        ;;
    mx*)
        motif="$brightblack"
        a="$brightblack"
        read -r LOGO <<EOF
         \\\\\\\\\\\\    //      \n\
          \\\\\\\\\\\\  //       \n\
           \\\\\\\\\\\\//        \n\
            \\\\\\\\\\\\         \n\
       *    /\\\\\\\\\\\\        \n\
     <\`$a~$xx\`> // \\\\\\\\\\\\  *    \n\
   <\`$a~~~~~$xx//   \\\\\\\\\\\\\`$a~$xx\`>  \n\
 <\`$a~~~~~~$xx//$a~$xx\`> <\\\\\\\\\\\\$a~~~$xx\`>\n
EOF
        ;;
    nixos*)
        motif="$brightblue"
        a="$blue$zz"
        b="$brightcyan"
        read -r LOGO <<EOF
       $a\\\\\\\\$xx    $b\\\\\\\\  //$xx    \n\
        $a\\\\\\\\$xx    $b\\\\\\\\//$xx     \n\
    $a::::://====$xx$b\\\\\\\\$xx  $a//$xx  \n\
       $b///$xx      $b\\\\\\\\$xx$a//$xx   \n\
  $b""""//$xx$a\\\\\\\\$xx      $a///""""$xx\n\
     $b//$xx  $a\\\\\\\\$xx$b====//:::::$xx \n\
        $a//\\\\\\\\$xx    $b\\\\\\\\$xx     \n\
       $a//  \\\\\\\\$xx    $b\\\\\\\\$xx    \n
EOF
        ;;
    opensuse*)
        motif="$brightgreen"
        a="$green$zz"
        b="$cyan"
        read -r LOGO <<EOF
        $a.,*,.$xx      \n\
     $a.'$xx  ${a}___$xx  $a'.$xx   \n\
   $a.'--<'($xx${b}o$xx$a)\`,$xx  $a'.$xx \n\
  ${a}4$xx     $b'_____$xx$a\`$xx   ${a}L$xx\n\
  ${a}V$xx       ${a}___'$xx    ${a}7$xx\n\
   $a\`,---->$xx      $a,\`$xx \n\
     $a\`,$xx       $a,\`$xx   \n\
        $a\`'*'\`$xx      \n
EOF
        ;;
    parabola*)
        motif="$brightblue"
        a="$blue$zz"
        read -r LOGO <<EOF
           ${a}_.__$xx   \n\
     ${a}_.,;"[ZAMW:+$xx \n\
  $a,;"\'\`       @#;:$xx\n\
            $a.\$#;/$xx \n\
           $a,/;/$xx   \n\
          $a/;/$xx     \n\
        $a;/>$xx       \n\
      $a,/$xx          \n
EOF
        ;;
    postmarket*)
        motif="$brightgreen"
        a="$green$zz"
        b="$brightblack"
        read -r LOGO <<EOF
         $a,/^\,$xx       \n\
         $a\L$xx $a\\\\\\\\\\\\$xx      \n\
       $a>_$xx    $a\\\\\\\\\\\\$xx     \n\
      $a///$xx $b/$xx $b\\\\$xx $a\\\\\\\\\\\\$xx    \n\
     $a///$xx $b/_$xx ${b}_\\\\$xx $a\KL$xx   \n\
    $a///$xx        $a/$xx ${a}__$xx  \n\
   $a///__\\\\$xx $a\_____/\\\\\\\\\\\\$xx \n\
  $a/=====/$xx $a/=========\\\\$xx\n
EOF
        ;;
    qubes*)
        motif="$brightblue"
        a="$blue$zz"
        read -r LOGO <<EOF
       $a.<>.$xx     \n\
    $a.<^>''<^>.$xx  \n\
  $a<^><$xx      $a><^>$xx\n\
  ${a}[:]$xx        ${a}[:]$xx\n\
  ${a}[:]$xx        ${a}[:]$xx\n\
  $a<:><$xx      $a><:>$xx\n\
     $a<.>..<.>>$xx  \n\
       $a\`<>\`$xx  $a</>$xx\n
EOF
        ;;
    raspbian*)
        motif="$brightred"
        a="$red$zz"
        b="$green"
        read -r LOGO <<EOF
  ${b}_,_$xx       ${b}_,_$xx  \n\
  $b\_$xx $b,\\\\$xx   $b/,$xx ${b}_/$xx  \n\
    $b\\\\$xx $b,\Y/,$xx $b/$xx    \n\
      $a($xx $a+$xx $a)      \n\
   $a(+$xx $a($xx $a+$xx $a)$xx $a+)$xx   \n\
  $a(+$xx $a(+)x(+)$xx $a+)$xx  \n\
   $a(+$xx $a($xx $a+$xx $a)$xx $a+)$xx   \n\
      $a($xx $a+$xx $a)$xx      \n
EOF
        ;;
    redhat*)
        motif="$brightred"
        a="$red$zz"
        b="$brightblack"
        read -r LOGO <<EOF
          $a,,.___,,.$xx        \n\
         $a<BwW5TZPdi\\\\$xx       \n\
        $a<ZvCVQpnkGUy\\\\$xx      \n\
   $a,<="Z$xx$b" : _ _ _ : :$xx$a=__$xx   \n\
  $a(/1Rc6Deh5cb1KsgJ6zKXD\`j$xx \n\
   $a\`n,YC4kWzhusgyeZ4tkLy2Lk$xx\n\
      $a\`ss ss_YWBPEmmxp__,\`$xx \n\
             $a\`'""'" \`$xx      \n
EOF
        ;;
    slack*)
        motif="$brightblue"
        a="$blue"
        read -r LOGO <<EOF
     $a,sSSSSSs,$xx $a##$xx\n\
    ${a}SS$xx       ${a}SS##$xx\n\
    ${a}Ss$xx         $a""$xx\n\
     $a\`sSS,.$xx      \n\
         $a"SSs,$xx   \n\
  $a##$xx         ${a}sS$xx  \n\
  $a##Ss$xx       ${a}SS$xx  \n\
  $a""$xx $a\`sSSSSSs\`$xx   \n
EOF
        ;;
    ubuntu*)
        motif="$brightyellow"
        a="$brightyellow$zz"
        b="$brightred$zz"
        read -r LOGO <<EOF
           $a.,C,.$xx  $b/**\\\\$xx\n\
          ${a}B>'-'<X:$xx$b\\\\**/$xx\n\
      $a.l,$xx        $a'GQ.$xx \n\
  $b/**\\\\$xx $a//$xx             \n\
  $b\\\\**/$xx $a\\\\\\\\$xx             \n\
      ${a}\`I\`$xx        $a,JS'$xx \n\
          ${a}U>,_,<N:$xx$b/**\\\\$xx\n\
           $a\`'c'\`$xx  $b\\\\**/$xx\n
EOF
        ;;
    void*)
        motif="$green"
        a="$green$zz"
        b="$brightgreen$zz"
        read -r LOGO <<EOF
        $b.,C,.$xx      \n\
         $b'-'<Z:.$xx   \n\
   $a.J.$xx        $b\`SO.$xx \n\
  ${a}4\$$a/$xx   $b/:+:\\\\$xx   $b\\\\@L$xx\n\
  ${a}V#$a\\\\$xx   $b\:+:/$xx   $b/?7$xx\n\
   $a\`NM,$xx        $b'v\`$xx \n\
     $a\`:F>,_,$xx       \n\
        $a\`'c'\`$xx      \n
EOF
        ;;
    zorin*)
        motif="$brightblue"
        a="$brightblue"
        read -r LOGO <<EOF
     $a//ZZZZZZZZZZZ\\\\\\\\$xx   \n\
    $zz//\`\`\`\`\`\`\`\`\`\`\`\`\`\\\\\\\\$xx  \n\
   $zz//......$xx$zz.     ...\\\\\\\\$xx \n\
  $a//ZZZZZZZ$xx$zz>    <$xx${a}ZZZZ\\\\\\\\$xx\n\
  $a\\\\\\\\ZZZZ$xx$zz>    <$xx${a}ZZZZZZZ//$xx\n\
   $zz\\\\\\\\\`\`$xx$zz\`     \`\`\`\`\`\`\`//$xx \n\
    $zz\\\\\\\\.............//$xx  \n\
     $a\\\\\\\\ZZZZZZZZZZZ//$xx   \n
EOF
        ;;
    *)
        motif="$brightyellow"
        a="$brightblack"
        b="$yellow"
        read -r LOGO <<EOF
        ${a}XXXX$xx      \n\
       ${a}X$xx${zz}^$xx${a}XX$xx${zz}^$xx${a}X$xx     \n\
       ${a}X$xx${b}<XX>$xx${a}X$xx     \n\
     ${a}XX${xx}X${a}XXXX${xx}X${a}XX$xx   \n\
    ${a}XX${xx}XXXXXXXX${a}XX$xx  \n\
   ${a}XX${xx}XXXXXXXXXX${a}XX$xx \n\
  ${b}I$xx${a}XXX${xx}XXXXXXXX${a}XXX$xx${b}I$xx\n\
  ${b}IL>$xx${a}XX${xx}XXXXXX$xx${a}XX$xx${b}<JI$xx\n
EOF
        ;;
esac
unset IFS

motif=$motif$zz

###########################################
# adding only existing layers to info     #
###########################################
INFO="$motif${USERNAME:-${USER:-${LOGNAME:-$(whoami)}}}$xx @ $motif$HOSTNAME$xx"
valign() {
    awk "BEGIN { while (i++ < 10 - length(\"$1\")) printf \" \" }"
}
for i in OS KERNEL ARCH UPTIME PACKAGES SHELL DESKTOP; do
    v="$(deref "$i")"
    [ "$v" ] &&
        INFO="$INFO
${motif}$i:$xx$(valign "$i")$v"
done

###########################################
# yielding everything                     #
###########################################
# order: user@hostname, OS, kernel, arch, uptime, packages, shell, desktop
for i in $(seq 8); do
    # shellcheck disable=SC2059 # can't do anything about it
    echo "${INFO_ONLY-"$(elem "$i" "$LOGO")  $(elem "$i" "$PALETTE")| "}$(elem "$i" "$INFO")"
done
