#!/usr/bin/env bash

## Copyright (C) 2020-2023 Aditya Shakya <adi1090x@gmail.com>
##
## Openbox Pipemenu to change fonts for various applications

# Variables and functions
MENUS_LIBDIR='/usr/share/debiancraft/openbox/menulib'
if ! . "$MENUS_LIBDIR/debiancraft.cfg" 2> /dev/null; then
	echo "Error: Failed to locate debiancraft.cfg in $MENUS_LIBDIR" >&2
	exit 1
fi

# Theme
themedir="$HOME/.config/openbox-themes/themes"
ctheme="`cat $themedir/.current`"

# Dir
confdir="$HOME/.config"
termdir="$confdir/alacritty"
dunstdir="$confdir/dunst"
oboxdir="$confdir/openbox"
polydir="$themedir/$ctheme/polybar"
rofidir="$themedir/$ctheme/rofi"

# Font
getfonts () {
	FONT=$(yad --title='Select A Font' --font --separate-output --button=Cancel:1 --button=Select:0)
	FNAME=$(echo $FONT | cut -d'|' -f1)
	FSTYLE=$(echo $FONT | cut -d'|' -f2)
	FSIZE=$(echo $FONT | cut -d'|' -f3)
}

font_bar () {
	if [[ "$FONT" ]]; then
		sed -i -e "s/font-0 = .*/font-0 = $FNAME:$FSTYLE:size=$FSIZE;2/g" ${polydir}/config.ini
		polybar-msg cmd restart
	else
		exit 0
	fi
}

font_rofi () {
	if [[ "$FONT" ]]; then
		sed -i -e "s/font:.*/font: \"$FNAME $FSTYLE $FSIZE\";/g" ${rofidir}/shared/fonts.rasi
	else
		exit 0
	fi
}

font_term () {
	if [[ "$FONT" ]]; then
		sed -i -e "s/family: .*/family: \"$FNAME\"/g" ${termdir}/fonts.yml
		sed -i -e "s/size: .*/size: $FSIZE/g" ${termdir}/fonts.yml
	else
		exit 0
	fi
}

font_ob () {
	if [[ "$FONT" ]]; then
		namespace="http://openbox.org/3.4/rc"
		config="$oboxdir/rc.xml"

		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:name' -v "$FNAME" "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:size' -v "$FSIZE" "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:weight' -v Bold "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:slant' -v Normal "$config"

		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:name' -v "$FNAME" "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:size' -v "$FSIZE" "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:weight' -v Normal "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:slant' -v Normal "$config"

		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuHeader"]/a:name' -v "$FNAME" "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuHeader"]/a:size' -v "$FSIZE" "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuHeader"]/a:weight' -v Bold "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuHeader"]/a:slant' -v Normal "$config"

		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuItem"]/a:name' -v "$FNAME" "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuItem"]/a:size' -v "$FSIZE" "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuItem"]/a:weight' -v Normal "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuItem"]/a:slant' -v Normal "$config"

		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveOnScreenDisplay"]/a:name' -v "$FNAME" "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveOnScreenDisplay"]/a:size' -v "$FSIZE" "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveOnScreenDisplay"]/a:weight' -v Bold "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveOnScreenDisplay"]/a:slant' -v Normal "$config"

		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveOnScreenDisplay"]/a:name' -v "$FNAME" "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveOnScreenDisplay"]/a:size' -v "$FSIZE" "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveOnScreenDisplay"]/a:weight' -v Normal "$config"
		xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveOnScreenDisplay"]/a:slant' -v Normal "$config"

		openbox --reconfigure
	else
		exit 0
	fi
}

font_dunst () {
	if [[ "$FONT" ]]; then
		sed -i -e "s/font = .*/font = $FNAME $FSTYLE $FSIZE/g" ${dunstdir}/dunstrc
		pkill dunst && dunst &
	else
		exit 0
	fi
}

font_gtk () {
	if [[ "$FONT" ]]; then
		xfconf-query -c xsettings -p /Gtk/FontName -s "$FNAME $FSTYLE $FSIZE"
	else
		exit 0
	fi
}

if [[ "$1" == "--bar" ]]; then
	getfonts
	font_bar

elif [[ "$1" == "--rofi" ]]; then
	getfonts
	font_rofi

elif [[ "$1" == "--terminal" ]]; then
	getfonts
	font_term

elif [[ "$1" == "--openbox" ]]; then
	getfonts
	font_ob

elif [[ "$1" == "--dunst" ]]; then
	getfonts
	font_dunst

elif [[ "$1" == "--gtk" ]]; then
	getfonts
	font_gtk

elif [[ "$1" == "--all" ]]; then
	getfonts
	font_bar
	font_rofi
	font_term
	font_ob
	font_dunst
	font_gtk

else
    menuStart
        menuItem 'Status Bar (polybar)' "$0 --bar"
        menuItem 'Launchers (rofi)' "$0 --rofi"
        menuItem 'Terminal (alacritty)' "$0 --terminal"
        menuItem 'Desktop (openbox)' "$0 --openbox"
        menuItem 'Notifications (dunst)' "$0 --dunst"
        menuItem 'Applications (gtk)' "$0 --gtk"
        menuSeparator
        menuItem 'Change Globally' "$0 --all"
    menuEnd
fi

exit 0
