#!/bin/sh

setup_displaymanager() {
	case "${1}" in
		gdm3)
			# autologin + greeter theme
			# timed login required for login after x restart
			sed -i	-e "/^AutomaticLogin\=.*/d" \
				-e "/^AutomaticLoginEnable\=.*/d" \
				-e "/^TimedLoginEnable\=.*/d" \
				-e "/^TimedLogin\=.*/d" \
				-e "/^TimedLoginDelay\=.*/d" \
				-e "s/^\(\[daemon\]$\)/\1\nAutomaticLogin\=${FLL_LIVE_USER}\nAutomaticLoginEnable\=true\n \
					\nTimedLoginEnable\=true\nTimedLogin\=${FLL_LIVE_USER}\nTimedLoginDelay\=1/" \
					/etc/gdm3/daemon.conf

			if [ "${FLL_XTYPE}" = "x11" ]; then
				sed -i "s/#WaylandEnable=false/WaylandEnable=false/" /etc/gdm3/daemon.conf
			fi

			# preselect the xsession
			cat > /etc/skel/.dmrc <<EOF
[Desktop]
Session=${FLL_XSESSION}
EOF
			;;
		lightdm)
			# set autologin user and set timeout to zero
			mkdir -p /etc/lightdm/lightdm.conf.d
			if [ ! -e "/etc/lightdm/lightdm.conf.d/80_${FLL_LIVE_USER}.conf" ]; then
				cat >"/etc/lightdm/lightdm.conf.d/80_${FLL_LIVE_USER}.conf" <<EOF
[SeatDefaults]
greeter-hide-users=false
autologin-user=${FLL_LIVE_USER}
autologin-user-timeout=0
autologin-session=${FLL_XSESSION}
EOF
			fi
			;;
		lxdm)
			# set autologin user
			if [ -L /etc/lxdm/default.conf ] && [ ! -e "/etc/lxdm/${FLL_LIVE_USER}.conf" ]; then
				rm -f /etc/lxdm/default.conf
				sed "s/^# autologin=.*/&\nautologin=${FLL_LIVE_USER}/" \
					"${1}/etc/lxdm/lxdm.conf" > "/etc/lxdm/${FLL_LIVE_USER}.conf"
				ln -fs "${FLL_LIVE_USER}.conf" /etc/lxdm/default.conf
			fi
			;;
		sddm)
			mkdir -p /etc/sddm.conf.d
			printf "\n[Autologin]\nUser=${FLL_LIVE_USER}\nSession=${FLL_XSESSION}\n" \
				>>"/etc/sddm.conf.d/${FLL_LIVE_USER}.conf"
			[ -z "${HOMECTL}" ] && printf "Relogin=true\n" \
				>>"/etc/sddm.conf.d/${FLL_LIVE_USER}.conf"

			if [ "${FLL_XTYPE}" = "x11" ]; then
				sed -i 's/^DisplayServer=.*/DisplayServer=x11/' /etc/sddm.conf.d/*.conf
			fi
			;;
			slim)
			# set autologin for $FLL_LIVE_USER to yes
			sed -i	-e "s/^default_user.*/\#FLL\#&/" \
				-e "s/^\#FLL\#\(default_user[ \t]*${FLL_LIVE_USER}$\)/\1/" \
				-e "s/^auto_login.*/\#FLL\#&/" \
				-e "s/^\#FLL\#\(auto_login[ \t]*yes$\)/\1/" \
					/etc/slim.conf
			grep -q ^default_user /etc/slim.conf || \
				printf "default_user\t${FLL_LIVE_USER}\n" >> /etc/slim.conf
			grep -q ^auto_login /etc/slim.conf || \
				printf "auto_login\tyes\n" >> /etc/slim.conf
		;;
		greetd)
			if [ "${FLL_XSESSION}" = "hyprland" ]; then
				EXECUTE_CMD="Hyprland"
			else
				EXECUTE_CMD="${FLL_XSESSION}"
			fi

			if [ -n "${FLL_XSESSION}" ] && [ -x /usr/bin/tuigreet ]; then
				TUITHEME="border=magenta;text=cyan;prompt=cyan;time=cyan;action=cyan;button=magenta;container=black;input=magenta"
				GREETER_CMD="/usr/bin/tuigreet --greeting 'Welcome to ${FLL_DISTRO_NAME}'"
				GREETER_CMD="${GREETER_CMD} --time --user-menu --user-menu-max-uid 60513"
				GREETER_CMD="${GREETER_CMD} --asterisks --remember --remember-user-session"
				GREETER_CMD="${GREETER_CMD} --power-shutdown 'systemctl -i poweroff'"
				GREETER_CMD="${GREETER_CMD} --power-reboot 'systemctl -i reboot'"
				GREETER_CMD="${GREETER_CMD} --cmd '${EXECUTE_CMD}' --theme '${TUITHEME}'"
			else
				case "${FLL_XSESSION}" in
					sway|hyprland)
					GREETER_CMD="${EXECUTE_CMD} --config /etc/greetd/${FLL_XSESSION}-config"
					GREETER="agreety -c ${EXECUTE_CMD}"
					[ -x /usr/sbin/wlgreet ] && GREETER="wlgreet -c ${EXECUTE_CMD}"
					[ -x /usr/bin/gtkgreet ] && GREETER="gtkgreet -l -c ${EXECUTE_CMD}"
					if [ -x /usr/bin/nwg-hello ]; then
						GREETER_CMD= "${EXECUTE_CMD} -c /etc/nwg-hello/${FLL_XSESSION}-config"
					elif [ "${FLL_XSESSION}" = "sway" ]; then
						cat > /etc/greetd/sway-config <<EOF
exec "${GREETER}; swaymsg exit"

bindsym Mod4+shift+e exec swaynag \
-t warning \
-m 'What do you want to do?' \
-b 'Poweroff' 'systemctl -i poweroff' \
-b 'Reboot' 'systemctl -i reboot'

include /etc/sway/sway-config.d/*
EOF
					elif [ "${FLL_XSESSION}" = "hyprland" ]; then
						cat > /etc/greetd/hyprland.conf <<EOF
exec-once = ${GREETER}; hyprctl dispatch exit
EOF
					fi
					;;

					labwc)
					GREETER="agreety"
					[ -x /usr/sbin/wlgreet ] && GREETER="wlgreet"
					[ -x /usr/bin/gtkgreet ] && GREETER="gtkgreet"
					GREETER_CMD="labwc --startup ${GREETER}"
					;;
				esac
			fi

			if [ -n "${GREETER_CMD}" ]; then
				sed -i "s#^command = ".*"#command = \"${GREETER_CMD}\"#" \
					/etc/greetd/config.toml

				cat >> /etc/greetd/config.toml <<EOF

[initial_session]
command = "${EXECUTE_CMD}"
user = "${FLL_LIVE_USER}"
EOF
			fi
			;;
	esac
}

setup_desktop() {
	# This function may be called twice for the same desktop if user
	# supplied a desktop= cheatcode - everything below must be imdepotent
	case "${1}" in
		*.desktop)
			DESKTOP_FILE="${1}"
			;;
		*)
			if [ "${1#*-*}" = "x11" ]; then
				DESKTOP_FILE=$(find /usr/share/xsessions -type f -iname "${1%-*}*.desktop" \
					| sort | head -n 1)
			elif [ "${1#*-*}" = "wayland" ]; then
				DESKTOP_FILE=$(find /usr/share/wayland-sessions -type f -iname "${1%-*}*.desktop" \
					| sort | head -n 1)
			else
				DESKTOP_FILE=$(find /usr/share/*sessions -type f -iname "${1}.desktop" \
					| sort | head -n 1)
			fi
			if [ ! -f "${DESKTOP_FILE}" ]; then
				DESKTOP_FILE=$(find /usr/share/*sessions -type f -iname "${1%-*}-*.desktop" \
					| sort | head -n 1)
			fi
			if [ ! -f "${DESKTOP_FILE}" ]; then
				DESKTOP_FILE=$(find /usr/share/*sessions -type f -iname "${1}*.desktop" \
					| sort | head -n 1)
			fi
			# failed to determine the "correct" desktop file from desktop= cheatcode
			if [ ! -f "${DESKTOP_FILE}" ]; then
				echo "fll_desktop: desktop session file not found for: ${1}"
				exit 1
			fi
			# update calamares
			DESKTOP_EXEC=$(awk -F= '/^TryExec/{ print $2 }' "${DESKTOP_FILE}")
			if [ -z "${DESKTOP_EXEC}" ]; then
				DESKTOP_EXEC=$(awk -F= '/^Exec/{ print $2 }' "${DESKTOP_FILE}")
			fi
			if [ -n "${DESKTOP_EXEC}" ]; then
				sed -i -e 's/#defaultDesktopEnvironment:/defaultDesktopEnvironment:/' \
					-e "s/^.*executable: \".*\"$/    executable: \"$(basename ${DESKTOP_EXEC% *})\"/" \
					-e "s/^.*desktopFile: \".*\"$/    desktopFile: \"$(basename ${DESKTOP_FILE})\"/" \
					/etc/calamares/modules/displaymanager.conf
			fi
			;;
	esac

	FLL_XSESSION="$(basename ${DESKTOP_FILE%.desktop})"
	case "${DESKTOP_FILE}" in
		/usr/share/xsessions/*)
			FLL_XTYPE="x11"
			;;
		/usr/share/wayland-sessions/*)
			FLL_XTYPE="wayland"
			;;
		*)
			echo "fll_desktop: unsupported desktop session: ${DESKTOP_FILE}"
			exit 1
			;;
	esac

	case "${FLL_XSESSION}" in
		lxqt)
			# set window_manager=openbox
			mkdir -p /etc/skel/.config/lxqt
			cp /etc/xdg/lxqt/session.conf \
				/etc/skel/.config/lxqt/session.conf
			;;
		lxqt-wayland)
			# Support various compositors of lxqt (default: labwc)
			case "${1}" in
				lxqt-labwc)
					[ -x /usr/bin/labwc ] && \
					sed -i 's#^compositor=.*#compositor=/usr/bin/labwc#' \
						/etc/xdg/lxqt/session.conf
					;;
				lxqt-kwin)
					[ -x /usr/bin/kwin_wayland ] && \
					sed -i 's#^compositor=.*#compositor=/usr/bin/kwin_wayland#' \
						/etc/xdg/lxqt/session.conf
					;;
				lxqt-hyprland)
					[ -x /usr/bin/Hyprland ] && \
					sed -i 's#^compositor=.*#compositor=/usr/bin/Hyprland#' \
						/etc/xdg/lxqt/session.conf
					;;
				lxqt-sway)
					[ -x /usr/bin/sway ] && \
					sed -i 's#^compositor=.*#compositor=/usr/bin/sway#' \
						/etc/xdg/lxqt/session.conf
					;;
				lxqt-wayfire)
					[ -x /usr/bin/wayfire ] && \
					sed -i 's#^compositor=.*#compositor=/usr/bin/wayfire#' \
						/etc/xdg/lxqt/session.conf
					;;
			esac
			# Solve a chicken and egg problem: preselect wayland compositor
			# or else startlxqt launches lxqt session preferences dialog on
			# first login
			mkdir -p /etc/skel/.config/lxqt
			cp /etc/xdg/lxqt/session.conf \
				/etc/skel/.config/lxqt/session.conf
			# Hack to set initial dark theme
			mkdir -p /etc/skel/.config/labwc
			sed -e 's/Vent/Vent-dark/' \
				/usr/share/lxqt/wayland/labwc/rc.xml \
				> /etc/skel/.config/labwc/rc.xml
			;;
		labwc)
			. /etc/default/keyboard
			if [ "${XKBVARIANT}" ]; then
				XKB_DEFAULT_LAYOUT="${XKBLAYOUT}(${XKBVARIANT})"
			else
				XKB_DEFAULT_LAYOUT="${XKBLAYOUT}"
			fi
			if ! grep -q '^XKB_DEFAULT_LAYOUT=' /etc/xdg/labwc/environment; then
				cat >> /etc/xdg/labwc/environment <<EOF
XKB_DEFAULT_LAYOUT="${XKB_DEFAULT_LAYOUT}"
EOF
			fi
			;;
		hyprland)
			# Hyprland doesn't appear to read from /etc/xdg
			mkdir -p /etc/skel/.config
			cp -a /usr/share/aptosid-settings-hyprland/hypr /etc/skel/.config/
			. /etc/default/keyboard
			sed -i "s#\#kb_model =#kb_layout = ${XKBLAYOUT}#" /etc/skel/.config/hypr/hyprland.conf
			sed -i "s#\#kb_variant =#kb_variant = ${XKBVARIANT}#" /etc/skel/.config/hypr/hyprland.conf
			sed -i "s#\#kb_model =#kb_model = ${XKBMODEL}#" /etc/skel/.config/hypr/hyprland.conf
			sed -i "s#\#kb_options =#kb_options = ${XKBOPTIONS}#" /etc/skel/.config/hypr/hyprland.conf
			;;
		sway)
			mkdir -p /etc/skel/.config/sway
			cp /usr/share/aptosid-settings-sway/config /etc/skel/.config/sway
			cp /usr/share/aptosid-settings-sway/colorscheme /etc/skel/.config/sway
			. /etc/default/keyboard
			sed -i "s#xkb_layout \"\"#xkb_layout \"${XKBLAYOUT}\"#" /etc/skel/.config/sway/config
			sed -i "s#xkb_variant \"\"#xkb_variant \"${XKBVARIANT}\"#" /etc/skel/.config/sway/config
			sed -i "s#xkb_model \"\"#xkb_model \"${XKBMODEL}\"#" /etc/skel/.config/sway/config
			sed -i "s#xkb_options \"\"#xkb_options \"${XKBOPTIONS}\"#" /etc/skel/.config/sway/config
			;;
	esac
}

# detect and setup all installed desktops
for desktop_file in /usr/share/*sessions/*.desktop; do
	[ -f "${desktop_file}" ] && setup_desktop "${desktop_file}"
done

# setup active desktop
for opt in $(cat /proc/cmdline); do
	case "${opt}" in
		desktop=*)
			setup_desktop "${opt#desktop=}"
			;;
	esac
done

# configure displaymanager
for displaymanager in greetd slim lxdm lightdm gdm3 sddm; do
	[ -x "$(which ${displaymanager})" ] || continue
	echo "Configuring ${displaymanager}..."
	setup_displaymanager "${displaymanager}"
done
