#!/bin/bash

get-items () {
    params="${@#*<menu }"; params="${params::-1}"
    eval "$params"
    ctg=($(cat "$HOME/.config/menus/$id.lst"))
    for c in ${ctg[@]}; do
	IFS='‖'
	c_detail=($c)
	if [ ! -f "$HOME/.config/menus/${c_detail[1]}.lst" ]; then
	    IFS=$'\n'
	    pre="  ${@%%<menu*}"
	    icon="$HOME/.config/menus/$id/$(basename ${c_detail[0]})"
	    icon=${icon/.svg/.png}
	    if [[ "${icon: -4}" != ".png" ]]; then icon="$icon.png"; fi
	    echo "$pre<item label='${c_detail[2]//\'/\&#x27;}' icon='$icon'>" >> menu.xml
	    [[ ${c_detail[1]} =~ \%[fFuU]$ ]] && c_detail[1]="$(echo "${c_detail[1]}" | sed 's@ %[UuFf]@@')"
#	    [[ ! ${c_detail[1]} =~ " Menu" ]] && c_detail[1]="${c_detail[1]// / }"
	    [ "${c_detail[1]::4}" = 'env ' ] && c_detail[1]="${c_detail[1]:4}"
	    [[ "${c_detail[1]}" =~ audacity|calendar-date|libreoffice ]] && lang="LANG=$LANG " || lang=""
	    echo "  $pre<action name='Execute'><execute>env LANGUAGE=$LANGUAGE $lang${c_detail[1]}</execute></action>" >> menu.xml
	    echo "$pre</item>" >> menu.xml
	fi
    done
}

installed="$(cat /usr/share/help/C/Starbuntu/index.page | grep "Version")"
installed="${installed#*Version }"; installed="${installed%%<*}"

cd $HOME/.config/openbox

echo "<?xml version='1.0' encoding='UTF-8'?>

<openbox_menu xmlns='http://openbox.org/'
        xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
        xsi:schemaLocation='http://openbox.org/
                file:///usr/share/openbox/menu.xsd'>"$'\n' > menu.xml

exec1=$"'Run Command ...'"
exec3=$"'File Manager'"
exec5=$"'E-mails & Contacts'"

echo "<menu id='root-menu' label='Openbox 3'>
  <separator />
  <separator label='Starbuntu $installed LTS'/>
  <separator label='Kernel: $(uname -r | rev | cut -c9- | rev)'/>
  <separator />
  <item label=$exec1 icon='$HOME/.icons/run.png'>
    <action name='Execute'><execute>env LANGUAGE=$LANGUAGE run</execute></action>
  </item>
  <item label='Terminal Emulator' icon='/usr/share/icons/gnome/48x48/apps/gnome-terminal.png'>
    <action name='Execute'><execute>env LANGUAGE=$LANGUAGE xterm</execute></action>
  </item>
  <item label=$exec3 icon='$HOME/.icons/rox.png'>
    <action name='Execute'><execute>env LANGUAGE=$LANGUAGE Rox -c</execute></action>
  </item>
  <item label='Web Browser' icon='$HOME/.icons/webbrowser.png'>
    <action name='Execute'><execute>env LANGUAGE=$LANGUAGE browser</execute></action>
  </item>
  <item label=$exec5 icon='$HOME/.icons/mail.png'>
    <action name='Execute'><execute>env LANGUAGE=$LANGUAGE x-email-client</execute></action>
  </item>
  <separator />
  <menu id='AppMenu' label='App Menu' icon='$HOME/.icons/starbuntu-logo-48.png'>" >> menu.xml

IFS=$'\n'
appmenu="$(cat /etc/xdg/menus/gnome-applications.menu | grep -E "\<Menu\>|\</Menu\>|\<Directory\>")"
appmenu="  <Menu>""${appmenu#*</Directory>$'\n'  <Menu>}"
appmenu="${appmenu%$'\n'</Menu>*}"
appmenu="${appmenu//Menu/menu}"
appmenu="${appmenu//.directory/}"
appmenu="${appmenu//<\/Directory>/}"
appmenu=($appmenu)

l_appmenu=${#appmenu[@]}; i=0
for ((k=0; k<l_appmenu; k++)); do
    if [[ ${appmenu[$k]} =~ "<Directory>" ]]; then
	ctg="${appmenu[$k]#*<Directory>}"
	if [ ! -f "$HOME/.config/menus/$ctg.lst" ]; then
	    unset appmenu[$((k-1))]
	    unset appmenu[$k]
	    unset appmenu[$((k+1))]
	    l_appmenu=$((l_appmenu+3))
	else
	    f_ctg=$(find $HOME/.config/menus/* -type f -exec grep -l "‖$ctg‖" {} +)
	    dir="$(basename "$f_ctg")"; dir="${dir/.lst/}"
	    cont_ctg="$(grep "‖$ctg‖" "$f_ctg")"
	    label="${cont_ctg##*‖}"; label="${label/▶ /}"
	    title[$i]="$label"; ((i++))
	    icon="${cont_ctg%%‖*}"
	    icon="$HOME/.config/menus/$dir/$(basename "$icon")"
	    icon=${icon/.svg/.png}
	    [ "${icon%.*}" = "$HOME/" ] && icon="$icon.png"
	    appmenu[$((k-1))]="${appmenu[$((k-1))]%<menu>*}<menu id='$ctg' label='$label' icon='$icon'>"
	    unset appmenu[$k]
	    l_appmenu=$((l_appmenu+1))
	fi
    fi
done

appmenu=(${appmenu[@]})
i=0; menu=0
for ((k=0; k<${#appmenu[@]}; k++)); do
    [[ ${appmenu[$k]} =~ "<menu" ]] && ((menu++))
    [[ ${appmenu[$k]} =~ "</menu" ]] && ((menu--))
    [[ ${appmenu[$k]} =~ "${title[$i]}" ]] && ((i++)) && [ $menu -gt 1 ] && unset title[$((i-1))]
done
label=($(echo "${title[*]}" | sort))

i=0
for l in ${label[@]}; do
    found=$(grep -n "'$l'" <<< $(echo "${appmenu[*]}"))
    m=${found%%:*}
    menu=1; n=$m
    until [ $menu -eq 0 ]; do
	[[ ${appmenu[$n]} =~ "<menu" ]] && ((menu++))
	[[ ${appmenu[$n]} =~ "</menu" ]] && ((menu--))
	((n++))
    done
    for ((k=m-1; k<n; k++)); do
	appmenu_sort[$i]="${appmenu[$k]}"
	echo "${appmenu_sort[$i]}" >> menu.xml
	[[ "${appmenu_sort[$i]}" =~ "<menu" ]] && get-items "${appmenu_sort[$i]}"
	((i++))
    done
done

exec6=$"'Edit ObConf'"
exec7=$"'Reconfigure OpenBox'"
exec8=$"'Restart OpenBox'"
exec9=$"'Choose Background'"; exec9="${exec9:1:-1}"
exec10=$"'Configure Panel'"
exec11=$"'Search Application ...'"
quit=$"'Terminate Session'"

echo "  </menu> <!-- AppMenu -->
  <separator />
  <item label=$exec6 icon='/usr/share/pixmaps/obconf.png'>
    <action name='Execute'><execute>env LANGUAGE=$LANGUAGE obconf</execute></action>
  </item>
  <item label=$exec7 icon='/usr/share/pixmaps/obconf.png'>
    <action name='Reconfigure' />
  </item>
  <item label=$exec8 icon='/usr/share/pixmaps/openbox.png'>
    <action name='Restart' />
  </item>
  <separator />
  <item label='${exec9//\'/\&#x27;}' icon='$HOME/.icons/wallpaper-engine.png'>
    <action name='Execute'><execute>env LANGUAGE=$LANGUAGE refresh-pinboard</execute></action>
  </item>
  <item label=$exec10 icon='/usr/share/icons/hicolor/scalable/apps/tint2conf.svg'>
    <action name='Execute'><execute>env LANGUAGE=$LANGUAGE sh -c 'tint2conf & wunwa Tint2; xdotool sleep 0.5 key Return'</execute></action>
  </item>
  <item label=$exec11 icon='$HOME/.icons/binoculars.png'>
    <action name='Execute'><execute>env LANGUAGE=$LANGUAGE search-app</execute></action>
  </item>
  <separator />
  <item label=$quit icon='/usr/share/icons/gnome/48x48/actions/system-log-out.png'>
    <action name='Execute'><execute>xdotool key Control+Alt+Delete</execute></action>
  </item>
</menu>
</openbox_menu>" >> menu.xml

sed -i 's/\&/\&amp;/g; s/<<</\&lt;\&lt;\&lt;/g' menu.xml

icon=""; not_e_icon=""
[ -e "/home/$(id -nu 1000)/missing-menu-icon" ] && rm /home/$(id -nu 1000)/missing-menu-icon
icon_theme=$(cat $HOME/.config/gtk-3.0/settings.ini | grep "icon-theme")
icon_theme=${icon_theme#*=}
icon=$(grep 'icon=' $HOME/.config/openbox/menu.xml | cut -d\' -f4 | grep ^/)
for i in $icon; do [ ! -e "$i" ] && not_e_icon="$not_e_icon$i"$'\n'; done
not_e_icon="${not_e_icon%*$'\n'}"
[ -n "$not_e_icon" ] && for n in $not_e_icon; do
    if [[ "$n" =~ "/menus/" ]]; then
        place="$(dirname "$n")"
	bn=$(basename "$n")
	bn=${bn/\.png/}; bn=${bn/\.svg/}
	nn=$(find $HOME/.icons -maxdepth 1 -name "$bn\.png" -o -name "$bn\.svg" | head -n 1)
	[ -z "$nn" ] && nn=$(find /usr/share/icons/$icon_theme -name "$bn\.png" -o -name "$bn\.svg" | grep 48 | head -n 1)
	[ -z "$nn" ] && nn=$(find /usr/share/icons/gnome -name "$bn\.png" -o -name "$bn\.svg" | grep 48 | head -n 1)
	[ -z "$nn" ] && nn=$(find /usr/share/icons/hicolor -name "$bn\.png" -o -name "$bn\.svg" | head -n 1)
	[ -z "$nn" ] && nn=$(find /usr/share/pixmaps -name "$bn\.png" -o -name "$bn\.svg" | head -n 1)
	[ -z "$nn" ] && bn="application-x-theme" && nn=$(find /usr/share/icons/$icon_theme -name "$bn\.png" -o -name "$bn\.svg" | grep 48 | head -n 1)
	if [ -n "$nn" ]; then
	    [ "${nn: -4}" = ".svg" ] && prestr="rsvg:" || prestr=""
	    convert -background none "$prestr$nn" -resize 16x16 "$place/$bn.png"
	else
	    echo "$n" >> /home/$(id -nu 1000)/missing-menu-icon
	fi
    else
	echo "$n" >> /home/$(id -nu 1000)/missing-menu-icon
    fi
done

openbox --reconfigure

exit 0

