#!/bin/bash

# =======================
# Define Colors
RED='\e[41m'
NC='\e[0m' # No color
BG='\e[7m' # Highlighting Background color
TC='\e[1m' # Highlighting Text color

STATUSVAR=1
TEXTEDITOR=$EDITOR
SELECTEDITEM=""

# =======================
# Service messages section
# Wrong Option
ERRORMSG="$RED Wrong option $NC"
TRYAGAINMSG=" Please try again..."
#
CONTINMSG="$RED To return press ENTER $NC"
CURRENTPREFIXMSG="(current: "
CURRENTSUFFIXMSG="):"
AVAILABLESHELLMSG="Available shells "
AVAILABLEDMMSG="Available display managers "
PS3SHELLCHOOSMSG="Which shell do you wish to install and use as default? "
ZSH1MSG="Z shell. Advanced and versatile shell with supreme configuration options and tab completion. Master of all trades, jack of none, but really needs configuration."
ZSH2MSG="check oh-my-zsh or builtin configuration tool for configurations"
ZSH3MSG="you might also like zsh-history-substring search or zsh-syntax-highlighting"
BASH1MSG="Bourne again shell. Standard for most linux systems. Respectable choice for any use. Jack of all trades, master of none."
FISH1MSG="Friendly interactive shell. Bad for scripting, great for interactive use without much configuration required."
DASH1MSG="Debian almquist shell. Super light and feature free. Great for scripting and fast startup, entirely unsuitable for interactive use."
PS3DISPLAYMNGMSG="Which displaymanager do you wish to install and use as default? "
PS3DISKUTILSMSG="Select tool to use? "
PS3CHOOSESESSIONMSG="Which session do you wish to use as default? "
NOSUPPORTAUTOLOGINMSG="No support for setting up autologin without displaymanager on openrc. Yet."
GDMWONTWORKMSG="gdm will not work with openrc"
CURRENTSHELLMSG="$(echo "$SHELL")"
SETSUFFIXMSG=" was set successfully"
SHELLPREFIXMSG="Shell "
DISPLAYMGRPREFIXMSG="Display manager "
AUTOLOGGERRPREFIXMSG="Autologger"
PRINTERSUPPORTMSG="Printer support"

# =======================
# Pacman installation
INSTALLPKGS="sudo pacman -Syu"

function pressanykeyrequest() {
	echo -e "$CONTINMSG"
	read -r
	STATUSVAR=1
}

function shell_chooser() {
	echo "$AVAILABLESHELLMSG$CURRENTPREFIXMSG$CURRENTSHELLMSG$CURRENTSUFFIXMSG"
	PS3="$PS3SHELLCHOOSMSG"
	SELECTEDITEM=""
	# Gather the results in an array.
	shells=("zsh" "bash" "fish" "dash" "cancel")

	select pick in "${shells[@]}"; do
		case $pick in
		zsh)
			echo ""
			echo "$ZSH1MSG"
			echo ""
			echo ""
			$INSTALLPKGS zsh zsh-completions
			STATUSVAR=$?
			if [ $STATUSVAR -eq 1 ]; then
				return $STATUSVAR
			fi
			echo ""
			echo ""
			echo "$ZSH2MSG"
			echo "$ZSH3MSG"
			echo ""
			echo ""
			chsh -s /usr/bin/zsh
			SELECTEDITEM="$pick"
			break
			;;
		bash)
			echo ""
			echo ""
			echo "$BASH1MSG"
			echo ""
			echo ""
			$INSTALLPKGS bash bash-completion
			STATUSVAR=$?
			if [ $STATUSVAR -eq 1 ]; then
				return $STATUSVAR
			fi
			echo ""
			chsh -s /bin/bash
			SELECTEDITEM="$pick"
			break
			;;
		fish)
			echo ""
			echo ""
			echo "$FISH1MSG"
			echo ""
			echo ""
			$INSTALLPKGS fish
			STATUSVAR=$?
			if [ $STATUSVAR -eq 1 ]; then
				return $STATUSVAR
			fi
			chsh -s /usr/bin/fish
			SELECTEDITEM="$pick"
			break
			;;
		dash)
			echo ""
			echo ""
			echo "$DASH1MSG"
			$INSTALLPKGS dash
			STATUSVAR=$?
			if [ $STATUSVAR -eq 1 ]; then
				return $STATUSVAR
			fi
			chsh -s /usr/dash
			SELECTEDITEM="$pick"
			break
			;;
		cancel)
			break
			;;
		esac
	done
	return $STATUSVAR
}

function displaymanager() {
	CURRENTITEM=$(dm_detect)
	if [ "$CURRENTITEM" == "" ]; then
		CURRENTITEM="none"
	fi
	PS3="$PS3DISPLAYMNGMSG"
	SELECTEDITEM=""
	# Gather the results in an array.
	dms=("lightdm" "gdm" "lxdm" "slim" "sddm" "cancel")
	sudo echo ""
	STATUSVAR=$?
	if [ $STATUSVAR -eq 1 ]; then
		return $STATUSVAR
	fi
	echo "$AVAILABLEDMMSG$CURRENTPREFIXMSG$CURRENTITEM$CURRENTSUFFIXMSG"
	select pick in "${dms[@]}"; do
		case $pick in
		slim)
			SELECTEDITEM="$pick"
			if ! [[ -d /run/openrc ]]; then
				$INSTALLPKGS slim slim-themes && sudo systemctl enable slim.service -f
				STATUSVAR=$?
			else
				$INSTALLPKGS slim slim-themes && sudo sed -i "s/$(grep "DISPLAYMANAGER=" /etc/conf.d/xdm)/DISPLAYMANAGER=\"slim\"/g" /etc/conf.d/xdm
				STATUSVAR=$?
				if [ $STATUSVAR -eq 1 ]; then
					return $STATUSVAR
				fi
				sudo rc-update add xdm default
				STATUSVAR=$?
			fi
			break
			;;
		lightdm)
			SELECTEDITEM="$pick"
			if ! [[ -d /run/openrc ]]; then
				$INSTALLPKGS lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings accountsservice &&
					sudo systemctl enable lightdm.service -f && sudo systemctl enable accounts-daemon &&
					sudo "$TEXTEDITOR" /etc/lightdm/lightdm.conf
				STATUSVAR=$?
			else
				$INSTALLPKGS lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings accountsservice &&
					sudo sed -i "s/$(grep "DISPLAYMANAGER=" /etc/conf.d/xdm)/DISPLAYMANAGER=\"lightdm\"/g" /etc/conf.d/xdm &&
					sudo "$TEXTEDITOR" /etc/lightdm/lightdm.conf
				STATUSVAR=$?
				if [ $STATUSVAR -eq 1 ]; then
					return $STATUSVAR
				fi
				sudo rc-update add xdm default
				STATUSVAR=$?
			fi
			break
			;;
		sddm)
			SELECTEDITEM="$pick"
			if ! [[ -d /run/openrc ]]; then
				$INSTALLPKGS sddm && sudo systemctl enable sddm.service -f
				STATUSVAR=$?
				if [ $STATUSVAR -eq 1 ]; then
					return $STATUSVAR
				fi
			else
				$INSTALLPKGS sddm && sudo sed -i "s/$(grep "DISPLAYMANAGER=" /etc/conf.d/xdm)/DISPLAYMANAGER=\"sddm\"/g" /etc/conf.d/xdm
				STATUSVAR=$?
				if [ $STATUSVAR -eq 1 ]; then
					return $STATUSVAR
				fi
				sudo rc-update add xdm default
				STATUSVAR=$?
			fi
			break
			;;
		lxdm)
			SELECTEDITEM="$pick"
			if ! [[ -d /run/openrc ]]; then
				$INSTALLPKGS lxdm && sudo systemctl enable lxdm.service -f
				STATUSVAR=$?
			else
				$INSTALLPKGS && sudo sed -i "s/$(grep "DISPLAYMANAGER=" /etc/conf.d/xdm)/DISPLAYMANAGER=\"lxdm\"/g" /etc/conf.d/xdm
				STATUSVAR=$?
			fi
			break
			;;
		gdm)
			SELECTEDITEM="$pick"
			if ! [[ -d /run/openrc ]]; then
				$INSTALLPKGS gdm && sudo systemctl enable gdm.service -f
				STATUSVAR=$?
			else
				echo "$GDMWONTWORKMSG"
				read -s n1
			fi
			break
			;;
		cancel)
			STATUSVAR=1
			break
			;;
		esac
	done
	return $STATUSVAR
}

function disk_utils() {
	PS3="$PS3DISKUTILSMSG"
	# Gather the results in an array.
	tools=("cfdisk" "cgdisk" "gdisk" "parted" "gparted" "gnome-disks" "cancel")

	select pick in "${tools[@]}"; do
		case $pick in
		cfdisk)
			sudo cfdisk
			break
			;;
		cgdisk)
			sudo cgdisk
			break
			;;
		gdisk)
			sudo gdisk
			break
			;;
		parted)
			sudo parted
			break
			;;
		gparted)
			sudo gparted
			break
			;;
		gnome-disks)
			sudo gnome-disks
			break
			;;
		cancel)
			break
			;;
		esac
	done
}

function dm_detect() {
	if [ "$(cat /proc/1/comm)" = "systemd" ]; then
		for displaymanager in gdm sddm lightdm lxdm slim; do
			systemctl cat display-manager.service 2>/dev/null | awk -F'/' '/^Exec/ {print $NF}'
		done
	else
		grep 'DISPLAYMANAGER=' /etc/conf.d/xdm | cut -d \" -f 2
	fi
}

function choose_session() {
	PS3="$PS3CHOOSESESSIONMSG"
	# Gather the results in an array.
	dms=("$(ls /usr/share/xsessions/)" "cancel")

	select pick in "${dms[@]}"; do
		case $pick in
		*)
			echo $pick
			break
			;;
		cancel)
			STATUSVAR=1
			break
			;;
		esac
	done
}

function autologger() {
	sudo echo ""
	STATUSVAR=$?
	if [ $STATUSVAR -eq 1 ]; then
		return $STATUSVAR
	fi
	dm=$(dm_detect)
	eval user="$(whoami)"
	case dm in
	slim)
		sudo sed -i '/autologin/s/^#//g' /etc/slim.conf && sudo sed -i '/defaultuser/s/^#//g' /etc/slim.conf
		sudo sed -i "s/simone/$user/g" /etc/slim.conf
		STATUSVAR=$?
		break
		;;
	lightdm)
		sudo sed -i "s/^autologin-user=*/autologin-user=$user/g" /etc/lightdm.conf
		sudo sed -i 's/^autologin-user-timeout=*/autologin-user-timeout=0/g' /etc/lightdm.conf
		sudo groupadd -r autologin
		sudo gpasswd -a "$user" autologin
		STATUSVAR=$?
		sudo "$TEXTEDITOR" /etc/lightdm.conf
		break
		;;
	sddm)
		session=$(choose_session)
		if [ $STATUSVAR -eq 1 ] || [ "$session" == "" ]; then
			return 1
		fi
		sudo sddm --example-config >/etc/sddm.conf
		sudo sed -i "s/^User=/User=$user/g" /etc/sddm.conf
		sudo sed -i "s/^Session/Session=$session/g" /etc/sddm.conf
		STATUSVAR=$?
		break
		;;
	lxdm)
		sudo sed -i "1s/^/autologin=$user /" /etc/lxdm/lxdm.conf
		STATUSVAR=$?
		sudo "$TEXTEDITOR" /etc/lxdm/lxdm.conf
		break
		;;
	gdm)
		sudo sed -i "s/^AutomaticLogin=*/AutomaticLogin=$user/g" /etc/gdm/custom.conf
		sudo sed -i 's/^AutomaticLoginEnable=*/AutomaticLoginEnable=true/g' /etc/gdm/custom.conf
		sudo sed -i 's/^TimedLoginEnable=*/TimedLoginEnable=true/g' /etc/gdm/custom.conf
		sudo sed -i 's/^TimedLogin=*/TimedLoginEnable=$user/g' /etc/gdm/custom.conf
		sudo sed -i 's/^TimedLoginDelay=*/TimedLoginDelay=0/g' /etc/gdm/custom.conf
		STATUSVAR=$?
		break
		;;
	*)
		echo -e "$NOSUPPORTAUTOLOGINMSG"
		read -s -n1
		;;
	esac
	return $STATUSVAR
}

function _recover() {
	if [ -e /usr/bin/photorec ]; then
		photorec
	else
		echo "Installing the testdisk recovery tool"
		if [ -e /var/lib/pacman/db.lck ]; then
			echo "Testdisk is not installed and pacman seems to be in use"
		else
			$INSTALLPKGS testdisk && testdisk
		fi
	fi
}

function main() {

	# Define Menu entries which will be run with the echo command
	E0="\e[1mQ\e[0muit"
	E1="Install Display \e[1mM\e[0manager"
	E2="\e[1mE\e[0mnable Autologin"
	E3="Install \e[1mS\e[0mhell"
	E4="\e[1mD\e[0misk Utility"
	E5="Install \e[1mP\e[0mrinter Support"
	E6="Recover \e[1mF\e[0miles"

	while true; do

		printf '\33[H\33[2J' # Use this instead of the clear command

		echo
		echo -e "                               $BG$TC Setup $NC"
		echo -e " $TC+----------------------------------------------------------------+$NC"
		echo -e " $TC|$NC    $BG 1 $NC $E1 $TC|$NC    $BG 2 $NC $E2       $TC|$NC"
		echo -e " $TC|$NC--------------------------------$TC|$NC-------------------------------$TC|$NC"
		echo -e " $TC|$NC    $BG 3 $NC $E3           $TC|$NC    $BG 4 $NC $E4           $TC|$NC"
		echo -e " $TC|$NC--------------------------------$TC|$NC-------------------------------$TC|$NC"
		echo -e " $TC|$NC    $BG 5 $NC $E5 $TC|$NC    $BG 6 $NC $E6          $TC|$NC"
		echo -e " $TC+----------------------------------------------------------------+$NC"
		echo ""
		echo -e "  Enter marked number or letter   -    $BG 0 $NC $E0 "

		# save entered number/letter in variable "choice"
		read -r -n 1 -e choice

		# test, whether "choice" fits any of the following numbers or letters
		case "$choice" in

		1 | m)
			echo
			displaymanager
			STATUSVAR=$?
			if [ $STATUSVAR -eq 0 ]; then
				echo ""
				echo -e "$DISPLAYMGRPREFIXMSG$SELECTEDITEM$SETSUFFIXMSG"
				pressanykeyrequest
			fi
			echo ""
			;;
		2 | e)
			echo
			autologger
			STATUSVAR=$?
			if [ $STATUSVAR -eq 0 ]; then
				echo ""
				echo -e "$AUTOLOGGERRPREFIXMSG$SETSUFFIXMSG"
				pressanykeyrequest
			fi
			echo ""
			;;
		3 | s)
			echo
			shell_chooser
			STATUSVAR=$?
			if [ $STATUSVAR -eq 0 ]; then
				echo ""
				echo -e "$SHELLPREFIXMSG$SELECTEDITEM$SETSUFFIXMSG"
				pressanykeyrequest
			fi
			echo ""
			;;
		4 | d)
			echo
			disk_utils
			echo ""
			;;
		5 | p)
			echo
			$INSTALLPKGS manjaro-printer sane
			STATUSVAR=$?
			if [ $STATUSVAR -eq 0 ]; then
				echo ""
				echo -e "$PRINTERSUPPORTMSG$SETSUFFIXMSG"
				pressanykeyrequest
			fi
			echo ""
			;;
		6 | f)
			echo
			_recover
			echo ""
			;;
		0 | Q | q)
			printf '\33[H\33[2J' && exit
			;;
		*) # do this, if $choice variable contains anything else not offered above
			echo -e "$ERRORMSG"
			echo -e "$TRYAGAINMSG"
			sleep 2
			;;
		esac
	done
}

main
