#!/bin/sh

die()
{
	[ $# -eq 0 ] && exit 1
	
	[ $# -gt 1 ] && \
	echo "error initiated at line $1 : 
	$2" 1>&2 || \
	echo "$1" 1>&2
	
	exit 1
}

if [ $# -eq 1 ]; then
	if [ "$1" = "--help" ]; then
		man `basename \`realpath $0\``
		exit 0
	fi
fi

[ $# -eq 0 ] || { die "I do not accept any argument; except --help"; }

b_nvidia=false

f_stagezero()
{
	out=`dialog --stdout --radiolist "Select your graphics chipset :" 16 38 5 \
	1 nvidia on \
	2 radeon off \
	3 amdgpu off \
	4 intel off \
	5 Other/Ignore off`
	
	r=$?

	if [ $r -eq 0 ]; then
		kldlist=""
	
		case "$out" in
			1)
				r=1
				
				while [ $r -ne 0 ]; do
					pkg install --yes nvidia-driver nvidia-texture-tools nvidia-settings nvidia-xconfig
					r=$?
				done

				b_nvidia=true
				kldlist="/boot/modules/nvidia.ko /boot/modules/nvidia-modeset.ko"
			;;
	
			2)
				r=1
				
				while [ $r -ne 0 ]; do
					pkg install --yes drm-kmod
					r=$?
				done

				if [ -e /boot/modules/radeonkms.ko ]; then
					kldlist="/boot/modules/radeonkms.ko"
				else
					kldlist="/boot/kernel/radeonkms.ko"
				fi

			;;
	
			3)
				r=1
				
				while [ $r -ne 0 ]; do
					pkg install --yes drm-kmod xf86-video-amdgpu
					r=$?
				done

				if [ -e /boot/modules/amdgpu.ko ]; then
					kldlist="/boot/modules/amdgpu.ko"
				else
					kldlist="/boot/kernel/amdgpu.ko"
				fi
			;;
	
			4)
				r=1
				
				while [ $r -ne 0 ]; do
					pkg install --yes drm-kmod xf86-video-intel
					r=$?
				done

				if [ -e /boot/modules/i915kms.ko ]; then
					kldlist="/boot/modules/i915kms.ko"
				else
					kldlist="/boot/kernel/i915kms.ko"
				fi
			;;
	
			5)
				return 0
			;;
		esac

		[ -n "$kldlist" ] && echo "kld_list=\"$kldlist\"" >> /etc/rc.conf
	fi

	return 0
}

postproc()
{
	dialog --title "Successfully installed desktop !" --msgbox \
"\n
Your desktop has been successfully installed    : - )\n\n
I am now going to start post-install processing to set up the following :\n\n
Wine 		(32-bit/64-bit Windows emulation layer; user-space)\n
Linuxulator	(64-bit Linux emulation layer; kernel-space)\n\n
System files :\n
/etc/fstab\n
/etc/devfs.conf\n
/etc/devfs.rules\n
/etc/rc.conf\n
/etc/sysctl.conf\n
/boot/loader.conf\n\n

Note :	existing originals will be saved with .bak extension" 60 80

	readonly UNITY=1
	readonly WIN32=$(( UNITY<<1 ))
	readonly WIN64=$(( UNITY<<2 ))
	readonly LINUX=$(( UNITY<<3 ))
	
	EMU=0

	dialog --title "Query" --yesno \
	"\nWould you like me to set up Wine (Windows emulation layer) ?" 7 50

	r=$?
	
	if [ $r -eq 0 ]; then
		out=`dialog --stdout --radiolist "Choose a mode :" 10 30 2 \
		1 32-bit on \
		2 64-bit off`

		r=$?

		if [ $r -eq 0 ]; then
			case $out in
				1)
					EMU=$(( EMU | UNITY | WIN32 ))
				;;
		
				2)
					EMU=$(( EMU | UNITY | WIN64 ))
				;;
			esac
		fi
	fi

	dialog --title "Query" --yesno \
	"\nWould you like me to set up Linuxulator (Linux emulation layer) ?" 7 50

	r=$?
	
	if [ $r -eq 0 ]; then
		EMU=$(( EMU | UNITY | LINUX ))
	fi

	my_emu=$(( EMU & UNITY ))

	result_win32=1
	result_win64=1
	result_linux=1

	if [ $my_emu -ne 0 ]; then
		my_emu=$(( EMU & WIN32 ))

		if [ $my_emu -ne 0 ]; then
			pkg install --yes i386-wine wine-mono wine-gecko
			result_win32=$?
		fi

		my_emu=$(( EMU & WIN64 ))

		if [ $my_emu -ne 0 ]; then
			pkg install --yes wine wine-mono wine-gecko
			result_win64=$?
		fi

		my_emu=$(( EMU & LINUX ))

		if [ $my_emu -ne 0 ]; then
			for kld in linux linux64; do
				if ! kldstat -q -n $kld; then
					kldload $kld
					
					[ $? -eq 0 ] || \
					die "$LINENO" "Unable to kldload $kld"
				fi
			done
			
			pkg install --yes linux_base-c7
			result_linux=$?
		fi
	fi

	flavour_linux=false

	if [ $(( EMU & LINUX )) -ne 0 ]; then
		if [ $result_linux -eq 0 ]; then
			flavour_linux=true
		fi
	fi

	#block for /etc/fstab
	{
		f=/etc/fstab
		mangled=`echo $f | sed 's|[^[:alpha:]]|_|g'`
		
		if [ "$flavour_linux" = "false" ]; then
			eval mandatory${mangled}="\"\
fdescfs /dev/fd fdescfs rw 0 0
procfs /proc procfs rw 0 0\""
		else
			eval mandatory${mangled}="\"\
fdescfs /dev/fd fdescfs rw 0 0
procfs /proc procfs rw 0 0
tmpfs /compat/linux/dev/shm tmpfs rw,mode=1777,size=1g 0 0
linprocfs /compat/linux/proc linprocfs rw 0 0
linsysfs /compat/linux/sys linsysfs rw 0 0\""
		fi
	}

	#block for /etc/rc.conf
	{
		f=/etc/rc.conf
		mangled=`echo $f | sed 's|[^[:alpha:]]|_|g'`
		
		if [ "$flavour_linux" = "false" ]; then
			eval mandatory${mangled}="\"\
devfs_system_ruleset=system
dbus_enable=YES
cupsd_enable=YES\""
		else
			eval mandatory${mangled}="\"\
devfs_system_ruleset=system
dbus_enable=YES
cupsd_enable=YES
linux_enable=YES\""
		fi
	}

	#block for /etc/sysctl.conf
	{
		f=/etc/sysctl.conf
		mangled=`echo $f | sed 's|[^[:alpha:]]|_|g'`
		
		if [ "$flavour_linux" = "false" ]; then
			eval mandatory${mangled}="\"\
vfs.usermount=1\""
		else
			eval mandatory${mangled}="\"\
vfs.usermount=1
compat.linux.osrelease=3.10.0
kern.ipc.shm_allow_removed=1\""
		fi
	}

	#block for /boot/loader.conf
	{
		f=/boot/loader.conf
		mangled=`echo $f | sed 's|[^[:alpha:]]|_|g'`
		
		eval mandatory${mangled}="\"\
kern.vty=vt\""
	}
	
	#block for /etc/devfs.rules
	{
		f=/etc/devfs.rules
		mangled=`echo $f | sed 's|[^[:alpha:]]|_|g'`
		
		eval mandatory${mangled}="\"\
[system=10]
add path 'usb/*' mode 0664 group operator
add path 'cd*' mode 0664 group operator
add path 'da*' mode 0664 group operator
add path 'video*' mode 0664 group operator\""
	}

	#block for /etc/devfs.conf
	{
		f=/etc/devfs.conf
		mangled=`echo $f | sed 's|[^[:alpha:]]|_|g'`
		
		if [ "$flavour_linux" = "false" ]; then
			eval mandatory${mangled}="\"\
own     /dev/pci        root:operator
perm    /dev/pci        0664
own     /dev/dri/card0  root:operator
perm    /dev/dri/card0  0664\""
		else
			eval mandatory${mangled}="\"\
own     /dev/pci        root:operator
perm    /dev/pci        0664
own     /dev/dri/card0  root:operator
perm    /dev/dri/card0  0664
link /compat/linux/dev/shm shm\""
		fi
	}

	for f in /etc/fstab /etc/sysctl.conf /boot/loader.conf /etc/rc.conf \
	/etc/devfs.rules /etc/devfs.conf; do
		[ -f $f ] && cp $f ${f}.bak
		mangled=`echo $f | sed 's|[^[:alpha:]]|_|g'`
		eval mandatory='$'mandatory${mangled}

		echo -e "\n#Section created by mkdesktop for $f :\n" >> $f
		echo "$mandatory" >> $f
	done

	for nodetype in pass cd xpt; do
		for node in /dev/${nodetype}*; do
			if echo $node | grep --silent "${nodetype}[[:digit:]][[:digit:]]*$"; then
				echo "own	$node	root:operator" >> /etc/devfs.conf
				echo "perm	$node	0664" >> /etc/devfs.conf
			fi
		done
	done

	echo

	cat <<-EOF
	Post-processing done.
	If you saw no errors anywhere, your box is raring to go    : - )
	A reboot is now needed - you will need to do that yourself.
	EOF

	return 0
}

f_stagezero
[ $? -eq 0 ] || die "$LINENO" "stage failure setting up graphics subsystem"

dialog --title "The toor user account" --msgbox "\n
In FreeBSD, it is generally preferable to su not to root, but to the
toor builtin account which has the same UID as root (0). The root
user's account must always use C shell - not a friendly shell.
The toor user, who has the same privileges as root, may however use
a different shell. For precisely that reason, in the next few screens
we set up the toor user account." 18 36

out=`dialog --stdout --radiolist "Select a shell for the toor user:" 10 30 2 \
1 bash on \
2 zsh off`

if [ $? -eq 0 ]; then
	case $out in
		1) shell=bash;;
		2) shell=zsh;;
	esac

	r=1

	while [ $r -ne 0 ]; do
		pkg install --yes $shell
		r=$?
	done

	chsh -s /usr/local/bin/$shell toor

	echo "Set the password for toor below:"
	passwd toor
fi

pkglist=""

out=`dialog --stdout --radiolist "Select a desktop environment to install:" 24 30 6 \
1 KDE on \
2 GNOME off \
3 XFCE off \
4 MATE off \
5 LXDE off \
6 Awesome (Tiling Window Manager) off`

r=$?

if [ $r -eq 0 ]; then
	case $out in
		1) desktop="kde5";;
		2) desktop="gnome3 gnome-menus";;
		3) desktop="xfce";;
		4) desktop="mate";;
		5) desktop="lxde-meta";;
		6) desktop="awesome";;
	esac

	pkglist="xorg sddm dbus $desktop"

	r=1
	
	while [ $r -ne 0 ]; do
		pkg install --yes $pkglist
		r=$?
	done

	dialog --title "The normal user account" --yesno "\n
Only a normal user can login with the X display manager.
Would you therefore like to add a normal user account ? If you
do not already have a normal account in the system, choose Yes.
Else you may choose No." 16 36
	
	if [ $? -eq 0 ]; then
		echo
		echo "Please add the normal user account below."
		echo "Make sure the account is additionally part of the video group".
		echo "Other groups you may like to add the normal user account into
are wheel and operator."
		echo
		adduser
	fi

	echo "sddm_enable=YES" >> /etc/rc.conf
	[ $b_nvidia = true ] && /usr/local/bin/nvidia-xconfig

	postproc
	r=$?
fi

exit $r
