#!/bin/bash

apps () {
    cd "$@"
    fls_tmp=($(find . -type f -name "*.desktop" | sort))
    fls_tmp=(${fls_tmp[@]//\.\//})
    fls_tmp=(${fls_tmp[@]//\.desktop/})
    files=($(find . -type f -name "*.desktop" | xargs -d '\n' grep -l "$ctg" | xargs -d '\n' grep -L "NoDisplay=true" | xargs -d '\n' grep -L "Hidden=true" | xargs -d '\n' grep -L "NotShowIn=.*GNOME" | xargs -d '\n' grep -L "OnlyShowIn=.*KDE" | sort))
    files=(${files[@]//\.\//})
    files=(${files[@]//\.desktop/})
    name_tmp=(); cmd_tmp=(); icn_tmp=(); i=0
    files=($(echo "${files[*]}" | sed '/(.*)/d'))
    for f in ${files[@]}; do
	if [[ ! " ${fls[@]} " =~ " $f " ]]; then
	    cont="$(cat "$f.desktop")"
	    if [[ "$cont" =~ "Categories=" ]]; then
		cats=${cont#*Categories=}
		cats=";${cats%%$'\n'*};"
		if [[ "$cats" =~ ";$ctg;" ]]; then
		    if [ $LANGUAGE != "en" ]; then
			lbl=$'\n'"Name[$LANGUAGE]="
			if [[ ! "$cont" =~ "$lbl" ]]; then lbl=$'\n'"Name[$LANGUAGE"; fi
		    else
			lbl=$'\n'"Name="
		    fi
		    if [[ ! "$cont" =~ "$lbl" ]]; then lbl=$'\n'"Name="; fi
		    lbl=${cont#*"$lbl"}
		    lbl=${lbl%%$'\n'*}
		    lbl=${lbl#*=}
		    name_tmp[$i]=$lbl
#		    name_tmp[$i]=${name_tmp[$i]//\&/&amp;}
		    comm=$'\n'"Exec="
		    comm=${cont#*"$comm"}
		    cmd_tmp[$i]=${comm%%$'\n'*}
		    [[ "$cont" =~ "Terminal=true" ]] && [[ ! "${cmd_tmp[$i]}" =~ "xterm -e" ]] && cmd_tmp[$i]="xterm -e ${cmd_tmp[$i]}"
		    icon="Icon="
		    if [[ "$cont" =~ $'\n'$icon ]]; then
			icon=${cont#*$'\n'$icon}
			icn_tmp[$i]=${icon%%$'\n'*}
		    else
			icn_tmp[$i]="application-x-theme"
		    fi
		    ((i++))
		fi
	    fi
	fi
    done
}

cd $HOME/.config/menus
rm *.lst

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="$(echo "$appmenu" | sed 's/ <!--.*//g')"
appmenu="${appmenu/  <Menu>/menu=1}"
appmenu="${appmenu//  <Menu>/((menu++))}"
appmenu="${appmenu//  <\/Menu>/((menu--))}"
appmenu="${appmenu//.directory/}"
appmenu="${appmenu//<Directory>/ctg[\$menu]=\"}"
appmenu="${appmenu//<\/Directory>/\"\; touch \"\$\{ctg[\$menu]\}.lst\"$'\n'    [ \$menu -eq 1 ] \&\& echo \"\$\{ctg[\$menu]\}\" >> Apps.lst \|\| echo \"\$\{ctg[\$menu]\}\" >> \"\$\{ctg[\$((menu-1))]\}.lst\"}"

bash <<< "$appmenu"

for f in $(ls *.lst); do
    cont_f=($(cat $f))
    for c in ${cont_f[@]}; do
	icon=$(grep 'Icon=' $HOME/.local/share/desktop-directories/$c.directory 2>/dev/null)
	[ -z "$icon" ] && icon=$(grep 'Icon=' /usr/share/desktop-directories/$c.directory 2>/dev/null)
	icon="${icon#*=}"; icon="${icon//\//\\/}"
	name="$(grep "Name=" $HOME/.local/share/desktop-directories/$c.directory 2>/dev/null)"; [ $LANGUAGE != "en" ] && nm=$(grep "Name\[$LANGUAGE.*\]=" $HOME/.local/share/desktop-directories/$c.directory 2>/dev/null) && [ -n "$nm" ] && name="$nm"
	if [ -z "$name" ]; then
	    name=$(grep "Name=" /usr/share/desktop-directories/$c.directory 2>/dev/null); [ $LANGUAGE != "en" ] && nm=$(grep "Name\[$LANGUAGE.*\]=" /usr/share/desktop-directories/$c.directory 2>/dev/null) && [ -n "$nm" ] && name="$nm"
	fi
	name="▶ ${name#*=}"
	name="${name/&/\\&}"
	sed -i "s/^$c$/$icon‖$c‖"$name"/" $f
    done
done

ctg=($(cat Apps.lst))
for ((k=0; k<${#ctg[@]}; k++)); do
	ctg[$k]="${ctg[$k]##*‖}‖${ctg[$k]}"
done
ctg=($(echo "${ctg[*]}" | sort))
ctg=(${ctg[*]#*‖})
echo "${ctg[*]}" > Apps.lst

deskdir=($(ls *.lst))
deskdir=(${deskdir[*]//.lst/})

for ctg in ${deskdir[@]}; do

    fls=()

    apps $HOME/.local/share/applications
    fls=(${fls_tmp[@]})
    icn=(${icn_tmp[@]})
    cmd=(${cmd_tmp[@]})
    name=(${name_tmp[@]})
    
    apps /usr/share/applications
    icn=(${icn[@]} ${icn_tmp[@]})
    cmd=(${cmd[@]} ${cmd_tmp[@]})
    name=(${name[@]} ${name_tmp[@]})

    i=0; namecomb=()
    for n in ${name[@]}; do
	namecomb[$i]="$n‖${cmd[$i]}‖${icn[$i]}"
	((i++))
    done
    namecomb=($(sort <<< "${namecomb[*]}"))

    cd $HOME/.config/menus
    for n in ${namecomb[@]}; do
	IFS='‖'
	name=($n)
	IFS=$'\n'
	for ((k=2; k>-1; k--)); do
	    echo -n "${name[$k]}" >> $ctg.lst
	    [ $k -gt 0 ] && sep="‖" || sep=$'\n'
	    echo -n "$sep" >> $ctg.lst
	done
    done

done

for ctg in ${deskdir[@]}; do
    [ -z "$(cat $ctg.lst)" ] && rm $ctg.lst && sed -i "/$ctg‖/d" Apps.lst
done

exit 0

