#!/usr/bin/env bash
#
# Author: Dmitry Razumov <asmeron@ublinux.com>
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
#
# Initial script for Linux UBLinux
# This script are launching before starting init from initrd script
# Current dir allways must be set to root (/)
# All system path must be relative, except initrd dirs

ENABLED=yes
[[ ${ENABLED} == "yes" ]] || exit 0
DEBUGMODE=no
PATH=.:/:/usr/bin:/usr/local/bin:/usr/local/sbin

[[ -d /usr/lib/ublinux ]] && { ROOTFS= ; CMD_CHROOT= ; } || { [[ -d /sysroot ]] && ROOTFS="/sysroot" || ROOTFS="."; CMD_CHROOT="chroot ${ROOTFS}"; }
SOURCE=${ROOTFS}/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
SOURCE=${ROOTFS}/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
debug_mode "$0" "$@"

SYSCONF="${ROOTFS}${SYSCONF}"
SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/system; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/desktop; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null

[[ -f ${ROOTFS}/etc/inittab ]] && sed -i 's/id:.:initdefault:/id:5:initdefault:/' ${ROOTFS}/etc/inittab

switch3don(){
    echo "COMPOSITING_SERVER_START=no" > ${SYSCONF}/compositing-server
    #Gnome-shell does not supports compiz, so turn on it only in classic mode and only after desktop started
    if [[ -x ${ROOTFS}/usr/bin/gnome-shell ]]; then
	echo -e "COMPOSITING_WM_START=no\nCOMPOSITING_WM=compiz-fusion" >${SYSCONF}/compositing-wm
	sed -i /COMPOSITING_WM_START/d ${SYSCONF}/config
        echo COMPOSITING_WM_START=yes >> ${SYSCONF}/config
    else
        echo -e "COMPOSITING_WM_START=yes\nCOMPOSITING_WM=compiz-fusion" > ${SYSCONF}/compositing-wm
    fi
#   [[ -f usr/lib/libDrakX/harddrake/autoconf.pm ]] && sed -i 's/^ *Xconfig::glx::write({});$/#    Xconfig::glx::write({});/' ${ROOTFS}/usr/lib/libDrakX/harddrake/autoconf.pm
    [[ -f etc/xdg/kwinrc ]] && sed -i s/^Enabled=.*/Enabled=false/ ${ROOTFS}/etc/xdg/kwinrc
}

switch3doff(){
    echo "COMPOSITING_SERVER_START=no" > ${SYSCONF}/compositing-server
    echo -e "COMPOSITING_WM_START=no\nCOMPOSITING_WM=compiz-fusion" > ${SYSCONF}/compositing-wm
    sed -i /COMPOSITING_WM_START/d ${SYSCONF}/config
#   [[ -f usr/lib/libDrakX/harddrake/autoconf.pm ]] && sed -i 's/^#    Xconfig::glx::write({});$/    Xconfig::glx::write({});/' ${ROOTFS}/usr/lib/libDrakX/harddrake/autoconf.pm
    [[ -f etc/xdg/kwinrc ]] && sed -i s/^Enabled=.*/Enabled=true/ ${ROOTFS}/etc/xdg/kwinrc
}

setupdm(){
    if [[ -f ${ROOTFS}/lib/systemd/system/$1.service ]]; then
	ln -sf /lib/systemd/system/$1.service ${ROOTFS}/etc/systemd/system/display-manager.service
	ln -sf /lib/systemd/system/graphical.target ${ROOTFS}/etc/systemd/system/default.target
	[[ -f ${SYSCONF}/desktop ]] && sed -i /DISPLAYMANAGER=/d ${SYSCONF}/desktop
	echo "DISPLAYMANAGER=${1%%-plymouth*}" >> ${SYSCONF}/desktop
	case ${1%%-plymouth*} in
	    lightdm)
		# FIX lightdm-greater
		mkdir -p ${ROOTFS}/usr/libexec
		ln -sf /usr/lib/at-spi-bus-launcher ${ROOTFS}/usr/libexec/at-spi-bus-launcher
		ln -sf init ${ROOTFS}/usr/bin/systemd
	    ;;
	esac
    fi
}

setupde(){
    local DESKTOP=$1
    local DESKTOP_FILE=$2
    local DESKTOP_FILE_PATH=${DESKTOP_FILE%/*}
    if [[ -f ${DESKTOP_FILE} ]] ;then
	sed -i /DESKTOP=/d ${SYSCONF}/desktop
	echo "DESKTOP=$1" >> ${SYSCONF}/desktop
#	ln -sf $1.desktop ${DESKTOP_FILE_PATH}/default.desktop
#	cat > ${DESKTOP_FILE_PATH}/default.desktop <<EOF
#[Desktop Entry]
#Encoding=UTF-8
#Name=DEFAULT
#Name[ru]=Сеанс по умолчанию (${1})
#Comment=Default UBLinux Session
#Comment[ru]=Предопределённая рабочая среда пользователя
#Exec=gtk-launch ${DESKTOP_FILE_PATH}/${1}.desktop
#Icon=
#Type=Application
#EOF
	cp -a ${DESKTOP_FILE_PATH}/$1.desktop ${DESKTOP_FILE_PATH}/default.desktop
	sed -i "s/Name=.*/Name=Default Session \(${1}\)/" ${DESKTOP_FILE_PATH}/default.desktop
	sed -i "s/Name\[ru\]=.*/Name\[ru\]=Сеанс по умолчанию \(${1}\)/" ${DESKTOP_FILE_PATH}/default.desktop
	[[ -d etc/X11/wmsession.d ]] && ln -sf /${DESKTOP_FILE_PATH}/default.desktop etc/X11/wmsession.d/00DEFAULT
	[[ -d etc/X11/dm/Sessions ]] && ln -sf /${DESKTOP_FILE_PATH}/default.desktop etc/X11/dm/Sessions/00DEFAULT.desktop
       #[ -d etc/X11/wmsession.d ] && cp -pf /${DESKTOP_FILE_PATH}/default.desktop etc/X11/wmsession.d/00DEFAULT
       #[ -d etc/X11/dm/Sessions ] && cp -pf /${DESKTOP_FILE_PATH}/default.desktop etc/X11/dm/Sessions/00DEFAULT.desktop
	case $1 in
	    xfce)
		# FIX xfce.screensaver add button
		[[ -f ${ROOTFS}/usr/share/dbus-1/services/org.xfce.ScreenSaver.service ]] && rm -f ${ROOTFS}/usr/share/dbus-1/services/org.xfce.ScreenSaver.service
		[[ -f ${ROOTFS}/etc/xdg/autostart/xscreensaver.desktop ]] && rm -f ${ROOTFS}/etc/xdg/autostart/xscreensaver.desktop
	    ;;
	esac
    fi
}

disabledmde(){
    [[ -f ${ROOTFS}/etc/inittab ]] && sed -i 's/id:.:initdefault:/id:3:initdefault:/' ${ROOTFS}/etc/inittab
    ln -sf /lib/systemd/system/multi-user.target ${ROOTFS}/etc/systemd/system/default.target
    DISPLAYMANAGER=none
    sed -i /DISPLAYMANAGER=/d ${SYSCONF}/desktop
    echo "DISPLAYMANAGER=${DISPLAYMANAGER}" >> ${SYSCONF}/desktop
    DESKTOP=none
    sed -i /DESKTOP=/d ${SYSCONF}/desktop
    echo "DESKTOP=$DESKTOP" >> ${SYSCONF}/desktop
}

[ "$(cmdline_parameter 3ddesktop)" ] && switch3don
[ "$(cmdline_parameter no3ddesktop)" ] && switch3doff

for i in $(cmdline_value desktop | tr , " " ) ;do
   case $i in
       3d)	switch3don ;;
       no3d)	switch3doff ;;
       xfce)	DESKTOP=xfce ;;
       kde)	DESKTOP=kde4 ;;
       gnome)	DESKTOP=gnome ;;
       gnome-shell|gnome3) DESKTOP=gnomeshell ;;
       lxde)	DESKTOP=lxde ;;
       lxqt)	DESKTOP=lxqt ;;
       i3)	DESKTOP=i3 ;;
       steam)	DESKTOP=steam ;;
       plasma)	DESKTOP=plasma ;;
       plasmax11) DESKTOP=plasmax11 ;;
       mate)	DESKTOP=mate ;;
       ukui)	DESKTOP=ukui ;;
       pantheon) DESKTOP=pantheon ;;
       none)	DISPLAYMANAGER=none && DESKTOP=none ;;
       lightdm)	DISPLAYMANAGER=lightdm ;;
       kdm)	DISPLAYMANAGER=kdm  ;;
       gdm)	DISPLAYMANAGER=gdm ;;
       slim)	DISPLAYMANAGER=slim ;;
       xdm)	DISPLAYMANAGER=xdm ;;
       lxdm)	DISPLAYMANAGER=lxdm ;;
       sddm)	DISPLAYMANAGER=sddm ;;
       lan)	sed -i s/ONBOOT=.*/ONBOOT=yes/ ${SYSCONF}/network-scripts/ifcfg-eth0 2>/dev/null ;;
       nolan)	sed -i s/ONBOOT=.*/ONBOOT=no/ ${SYSCONF}/network-scripts/ifcfg-eth0 2>/dev/null ;;
       *)	DESKTOP=${i,,} ;;
   esac
done

# Disable Display Manager
    [[ "${DESKTOP}" == "none" || "${DISPLAYMANAGER}" == "none" ]] && DESKTOP="none" && DISPLAYMANAGER="none" && disabledmde

# Autodetect Display Manager
    [[ -z "${DISPLAYMANAGER}" ]] && for i in slim xdm lxdm kdm gdm sddm lightdm; do
	[[ -f ${ROOTFS}/lib/systemd/system/$i.service ]] && DISPLAYMANAGER=$i
    done
    [[ -f ${ROOTFS}/lib/systemd/system/${DISPLAYMANAGER}-plymouth.service ]] && setupdm ${DISPLAYMANAGER}-plymouth && rm -f ${ROOTFS}/lib/systemd/system/${DISPLAYMANAGER}.service || setupdm ${DISPLAYMANAGER}

# Autodetect Display Environment
# /usr/share/xsessions/*.desktop for X's sessions and /usr/share/wayland-sessions/*.desktop for Wayland's.
    [[ -z ${DESKTOP} ]] && for SELECT_DESKTOP in i3 ukui steam lxde lxqt kde4 xfce pantheon mate gnome gnomeshell plasmax11; do
	[[ -f "${ROOTFS}/usr/share/xsessions/${SELECT_DESKTOP}.desktop" ]] && DESKTOP="${SELECT_DESKTOP}"
    done
    [[ -z ${DESKTOP} ]] && for SELECT_DESKTOP in gnome plasma; do
	[[ -f "${ROOTFS}/usr/share/wayland-sessions/${SELECT_DESKTOP}.desktop" ]] && DESKTOP="${SELECT_DESKTOP}"
    done
    if [[ -n ${DESKTOP} ]]; then
	if [[ -f "${ROOTFS}/usr/share/xsessions/${DESKTOP}.desktop" ]]; then
	    DESKTOP_FILE="${ROOTFS}/usr/share/xsessions/${DESKTOP}.desktop"
	elif [[ -f "${ROOTFS}/usr/share/wayland-sessions/${DESKTOP}.desktop" ]]; then
	    DESKTOP_FILE="${ROOTFS}/usr/share/wayland-sessions/${DESKTOP}.desktop"
	fi
        setupde ${DESKTOP,,} ${DESKTOP_FILE}
    fi

    #[[ -z "${DISPLAYMANAGER}" && -z "${DESKTOP}" ]] && disabledmde

# Set default user to Display Manager
    if [[ ${DISPLAYMANAGER} == "lightdm" && -n ${DISPLAYMANAGER_DEFAULTUSER} ]]; then
	sed -i /DISPLAYMANAGER_DEFAULTUSER=/d ${SYSCONF}/desktop
	echo "DISPLAYMANAGER_DEFAULTUSER=${DISPLAYMANAGER_DEFAULTUSER}" >> ${SYSCONF}/desktop
	mkdir -p ${ROOTFS}/var/lib/lightdm/.cache/lightdm-gtk-greeter/
	echo "[greeter]" >  ${ROOTFS}/var/lib/lightdm/.cache/lightdm-gtk-greeter/state
	echo "last-user=${DISPLAYMANAGER_DEFAULTUSER}" >> ${ROOTFS}/var/lib/lightdm/.cache/lightdm-gtk-greeter/state
	chown -Rf 41:41 ${ROOTFS}/var/lib/lightdm/
	chmod 1770 ${ROOTFS}/var/lib/lightdm/
	chmod 755 ${ROOTFS}/var/lib/lightdm/.cache/lightdm-gtk-greeter/
	chmod 644 ${ROOTFS}/var/lib/lightdm/.cache/lightdm-gtk-greeter/state
    fi
