# Nerdfetch, a simple system info script written in bash
# Source: https://github.com/ThatOneCalculator/NerdFetch
{pkgs, ...}: let
  nerdfetch = pkgs.writeShellScriptBin "nerdfetch" ''
          ostype="$(uname)"

          version=8.1.1
          font=nerd
          distrotype=none
          osi=""
          ki=""
          ri="󰍛"
          pi="󰏔"
          ui="󰅶"
          ci=""

          case $1 in
          "-p")
          	font=phosphor
          	osi=""
          	ki=""
          	ri=""
          	pi=""
          	ui=""
          	ci=""
          	;;
          "-c")
          	font=cozette
          	ki="♥"
          	ri=""
          	pi=""
          	ui=""
          	ci=""
          	;;
          "-e")
          	font=emoji
          	osi="🐧"
          	ki="💓"
          	ri="🐐"
          	pi="📦"
          	ui="☕"
          	ci="🎨"
          	;;
          "-v")
          	echo "NerdFetch $version"
          	exit
          	;;
          "-h")
          	echo "Flags:
          -c: Cozette font
          -p: Phosphor font
          -e: Emoji font
          -v: Version"
          	exit
          	;;
          esac

          if command -v getprop 1>/dev/null; then
          	distrotype=android
          fi
          kernel="$(echo $(uname -r) | cut -d'-' -f1-1)"
          case $ostype in
          *"Linux"*)
          	if [ $distrotype = android ]; then
          		host="$(hostname)"
          		USER="$(whoami)"
          		os="Android $(getprop ro.build.version.release)"
          		case $font in
          		phosphor) osi="" ;;
          		emoji) osi="🤖" ;;
          		*) osi="󰀲" ;;
          		esac
          	else
          		host="$(cat /proc/sys/kernel/hostname)"
          		. /etc/os-release
          		if [ -f /bedrock/etc/bedrock-release ]; then
          			os="$(brl version)"
          		else
          			os="''${PRETTY_NAME}"
          			if [ $font = nerd ]; then
          				case $(echo $ID | sed 's/ .*//') in
          				debian) osi="" ;;
          				arch) osi="󰣇" ;;
          				endeavouros) osi="" ;;
          				fedora) osi="" ;;
          				gentoo) osi="" ;;
          				rhel) osi="" ;;
          				slackware) osi="" ;;
          				void) osi="" ;;
          				alpine) osi="" ;;
          				nixos) osi="󱄅" ;;
          				artix) osi="" ;;
          				exherbo) osi="󰆚" ;;
          				mageia) osi="" ;;
          				manjaro) osi="" ;;
          				opensuse) osi="" ;;
          				solus) osi="" ;;
          				ubuntu) osi="" ;;
          				mint) osi="󰣭" ;;
          				trisquel) osi="" ;;
          				puppy) osi="" ;;
          				coreos) osi="" ;;
          				mx) osi="" ;;
          				vanilla) osi="" ;;
          				pop_os) osi="" ;;
          				raspbian) osi="" ;;
          				deepin) osi="" ;;
          				almalinux) osi="" ;;
          				garuda) osi="" ;;
          				centos) osi="" ;;
          				rocky) osi="" ;;
          				esac
          			elif [ $font = cozette ]; then
          				case $(echo $ID | sed 's/ .*//') in
          				debian) osi="" ;;
          				arch) osi="" ;;
          				fedora) osi="" ;;
          				gentoo) osi="" ;;
          				slackware) osi="" ;;
          				void) osi="" ;;
          				alpine) osi="" ;;
          				nixos) osi="" ;;
          				mageia) osi="" ;;
          				manjaro) osi="" ;;
          				opensuse) osi="" ;;
          				ubuntu) osi="" ;;
          				mint) osi="" ;;
          				coreos) osi="" ;;
          				centos) osi="" ;;
          				esac
          			fi
          		fi
          	fi
          	shell=$(basename "$SHELL")
          	;;
          *"Darwin"*)
          	host="$(hostname -f | sed -e 's/^[^.]*\.//')"
          	mac_product="$(/usr/libexec/PlistBuddy -c "Print:ProductName" /System/Library/CoreServices/SystemVersion.plist)"
          	mac_version="$(/usr/libexec/PlistBuddy -c "Print:ProductVersion" /System/Library/CoreServices/SystemVersion.plist)"
          	os="''${mac_product} ''${mac_version}"
          	case $font in
          	nerd) osi="" ;;
          	phosphor) osi="" ;;
          	cozette) osi="" ;;
          	emoji) osi="🍎" ;;
          	esac
          	;;
          *"FreeBSD"*)
          	host="$(hostname)"
          	distrotype=bsd
          	os="FreeBSD $(freebsd-version | sed 's/-.*//')"
          	case $font in
          	nerd) osi="" ;;
          	phosphor) osi="" ;;
          	cozette) osi="" ;;
          	emoji) osi="😈" ;;
          	esac
          	;;
          *"OpenBSD"*)
          	host="$(hostname)"
          	distrotype=bsd
          	os="OpenBSD $(uname -r)"
          	case $font in
          	nerd) osi="" ;;
          	phosphor) osi="" ;;
          	cozette) osi="⌘" ;;
          	emoji) osi="🐡" ;;
          	esac
          	;;
          *"NetBSD"*)
          	host="$(hostname)"
          	distrotype=netbsd
          	os="NetBSD $(uname -r)"
          	case $font in
          	nerd) osi="󰉀" ;;
          	phosphor) osi="" ;;
          	cozette) osi="" ;;
          	emoji) osi="🚩" ;;
          	esac
          	;;
          *)
          	os="Unix-like"
          	host="host"
          	;;
          esac

          ## PACKAGE MANAGER AND PACKAGES DETECTION

          MANAGER=$(which nix-env pkg flatpak yum zypper dnf rpm dpkg-query brew port pacman xbps-query emerge cave apk kiss pmm /usr/sbin/slackpkg bulge birb yay paru pacstall cpm pmm eopkg getprop 2>/dev/null)
          manager=$(basename "$MANAGER")
          if [ $distrotype = netbsd ]; then
          	manager="pkg_info-netbsd"
          fi
          case $manager in
          cpm) packages="$(cpm C)" ;;
          flatpak) packages="$(flatpak list --app | wc -l)" ;;
          brew) packages="$(printf '%s\n' "$(brew --cellar)/"* | wc -l)" ;;
          port) packages="$(port installed | wc -l)" ;;
          dpkg-query) packages="$(dpkg-query -f '${"binary:Package"}\n' -W | wc -l)" ;;
          rpm) packages="$(rpm -qa --last | wc -l)" ;;
          yum) packages="$(yum list installed | wc -l)" ;;
          dnf) packages="$(dnf list installed | wc -l)" ;;
          zypper) packages="$(zypper se | wc -l)" ;;
          pacman) packages="$(pacman -Q | wc -l)" ;;
          yay) packages="$(yay -Q | wc -l)" ;;
          paru) packages="$(paru -Q | wc -l)" ;;
          pacstall) packages="$(pacstall -L | wc -l)" ;;
          kiss) packages="$(kiss list | wc -l)" ;;
          emerge) packages="$(qlist -I | wc -l)" ;;
          pkg) packages="$(pkg info | wc -l | tr -d ' ')" ;;
          cave) packages="$(cave show installed-slots | wc -l)" ;;
          xbps-query) packages="$(xbps-query -l | wc -l)" ;;
          nix-env) packages="$(nix-store -q --requisites /run/current-system/sw | wc -l)" ;;
          apk) packages="$(apk list --installed | wc -l)" ;;
          pmm) packages="$(/bedrock/libexec/pmm pacman pmm -Q 2>/dev/null | wc -l)" ;;
          eopkg) packages="$(eopkg li | wc -l)" ;;
          /usr/sbin/slackpkg) packages="$(ls /var/log/packages | wc -l)" ;;
          bulge) packages="$(bulge list | wc -l)" ;;
          birb) packages="$(birb --list-installed | wc -l)" ;;
          pkg_info)
          	packages="$(pkg_info -A | wc -l)"
          	manager="pkg"
          	;;
          pkg_info-netbsd)
          	packages="$(pkg_info -a | wc -l)"
          	manager="pkg"
          	;;
          *)
          	if [ $distrotype = android ]; then
          		packages="$(dpkg-query -f '${"binary:Package"}\n' -W | wc -l)"
          		manager="dpkg"
          	else
          		packages="$(ls /usr/bin | wc -l)"
          		manager="bin"
          	fi
          	;;
          esac

          packages="''${packages#"''${packages%%[![:space:]]*}"}"
          manager=$(echo $manager | sed "s/-query//; s/\/usr\/.*\///")

          ## UPTIME DETECTION

          if [ $distrotype = android ]; then
          	uptime="$(echo $(uptime -p) | cut -c 4-)"
          elif [ $distrotype = bsd ] || [ $distrotype = netbsd ]; then
          	uptime="$(uptime | sed -e 's/.* up //; s/, [0-9]* user.*//')"
          else
          	case $ostype in
          	*"Linux"*)
          		IFS=. read -r s _ </proc/uptime
          		;;
          	*)
          		s=$(sysctl -n kern.boottime)
          		s=''${s#*=}
          		s=''${s%,*}
          		s=$(($(date +%s) - s))
          		;;
          	esac
          	d="$((s / 60 / 60 / 24))"
          	h="$((s / 60 / 60 % 24))"
          	m="$((s / 60 % 60))"
          	# Plurals
          	[ "$d" -gt 1 ] && dp=s
          	[ "$h" -gt 1 ] && hp=s
          	[ "$m" -gt 1 ] && mp=s
          	[ "$s" -gt 1 ] && sp=s
          	# Hide empty fields.
          	[ "$d" = 0 ] && d=
          	[ "$h" = 0 ] && h=
          	[ "$m" = 0 ] && m=
          	[ "$m" != "" ] && s=
          	# Make the output of uptime smaller.
          	[ "$d" ] && uptime="$d day$dp, "
          	[ "$h" ] && uptime="$uptime$h hour$hp, "
          	[ "$m" ] && uptime="$uptime$m min$mp"
          	[ "$s" ] && uptime="$uptime$s sec$sp"
          	uptime=''${uptime%, }
          fi

          ## RAM DETECTION

          case $ostype in
          *"Linux"*)
          	while IFS=':k ' read -r key val _; do
          		case $key in
          		MemTotal)
          			mem_used=$((mem_used + val))
          			mem_full=$val
          			;;
          		Shmem) mem_used=$((mem_used + val)) ;;
          		MemFree | Buffers | Cached | SReclaimable) mem_used=$((mem_used - val)) ;;
          		esac
          	done </proc/meminfo
          	mem_used=$((mem_used / 1024))
          	mem_full=$((mem_full / 1024))
          	;;
          *"Darwin"*)
          	mem_full=$(($(sysctl -n hw.memsize) / 1024 / 1024))
          	while IFS=:. read -r key val; do
          		case $key in
          		*' wired'* | *' active'* | *' occupied'*)
          			mem_used=$((mem_used + ${"val:-0"}))
          			;;
          		esac
          	done <-EOF
          		$(vm_stat)
          	EOF

          	mem_used=$((mem_used * 4 / 1024))
          	;;
          *"BSD"*)
          	mem_full=$(($(sysctl -n hw.physmem) / 1024 / 1024))
          	if [ $distrotype = netbsd ]; then
          		mem_free=$(($(vmstat | awk 'NR==3 {print $4}') / 1024))
          	else
          		mem_free=$(($(sysctl -n vm.stats.vm.v_free_count) * $(sysctl -n vm.stats.vm.v_page_size) / 1024 / 1024))
          	fi
          	mem_used=$((mem_full - mem_free))
          	;;
          *)
          	mem_full=1
          	mem_used=0
          	;;
          esac
          memstat="''${mem_used}/''${mem_full} MiB"
          if which expr >/dev/null 2>&1; then
          	mempercent="($(expr $(expr ''${mem_used} \* 100 / ''${mem_full}))%)"
          fi

          ## DEFINE COLORS

          bold='[1m'
          black='[30m'
          red='[31m'
          green='[32m'
          yellow='[33m'
          blue='[34m'
          magenta='[35m'
          cyan='[36m'
          white='[37m'
          grey='[90m'
          reset='[0m'

          ## USER VARIABLES -- YOU CAN CHANGE THESE

          lc="$reset$bold$magenta" # labels
          nc="$reset$bold$magenta" # labels
          hn="$reset$bold$magenta" # labels
          ic="$reset$white"          # info
          c0="$reset$grey"           # first color
          c1="$reset$white"          # second color
          c2="$reset$yellow"         # third color

          ## OUTPUT

    echo """
        ''${c0}      ___     ''${nc}''${USER}''${grey}@''${reset}''${hn}''${host}''${reset}
        ''${c0}     (''${c1}.. ''${c0}\    ''${lc}''${osi}  ''${ic}''${os}''${reset}
        ''${c0}     (''${c2}<> ''${c0}|    ''${lc}''${ki}  ''${ic}''${kernel}''${reset}
        ''${c0}    /''${c1}/  \\ ''${c0}\\   ''${lc}''${ri}  ''${ic}''${RAM}''${memstat} ''${mempercent}
        ''${c0}   ( ''${c1}|  | ''${c0}/|  ''${lc}''${pi}  ''${ic}''${packages} (''${manager})''${reset}
        ''${c2}  _''${c0}/\\ ''${c1}__)''${c0}/''${c2}_''${c0})  ''${lc}''${ui}  ''${ic}''${uptime}''${reset}
        ''${c2}  \/''${c0}-____''${c2}\/''${reset}   ''${lc}''${ci}  ''${red}███''${green}███''${yellow}███''${blue}███''${magenta}███''${cyan}███''${reset}
        """
  '';
in {home.packages = [nerdfetch];}
