#!/bin/bash

Info () {
title="Info"
author="Peter Starfinger"
mail="E-Mail: info@die-starfingers.de"
jahr="2022"
app="$(basename $0)"
msgid="The Starbuntu application
<i>\$app</i>
was written by"
info="$(gettext "$msgid" | (export PATH `envsubst --variables "$msgid"`; envsubst "$msgid"))"

yad --center --fixed --title="$title" --window-icon="info" --image="info" --borders=20 --text="$info"$'\n'$'\n'"$author"$'\n'"$mail"$'\n'$'\n'"$jahr"$'\n' --text-align=center --selectable-labels --button="OK" &
wunwa "$title" > /dev/null; xdotool key Home key Down
}

add_up () {
  if [ $type = "apps" ]; then
    cd "/tmp/hsperfdata_$USER/menus"
    cont="$(cat $param2.lst)"
    if [ "$param2.lst" != "Apps.lst" ]; then
	parent="$(grep -l "‖$param2‖▶" *.lst)"
	if [ "$parent" = "Apps.lst" ]; then
	    pic="starbuntu-logo-48"
	    cmd="multimenu apps"
	else
	    line="$(grep "‖${parent%.*}‖" *.lst)"
	    line="${line#*:}"
	    pic="${line%%‖*}"
	    cmd="${line#*‖}"
	    cmd="${cmd%‖*}"
	fi
	line="$pic‖$cmd‖◀ .."$'\n'
	[[ ! "$cont" =~ "$line" ]] && echo "$line$cont" > $param2.lst
	list="/tmp/hsperfdata_$USER/menus/$param2.lst"
    else
	list="Apps.lst"
    fi
  else
    line="$(cat /tmp/hsperfdata_$USER/$type.lst | head -n 1)"
    if [[ "$line" =~ ‖\{[^‖]*$ ]] || [[ "$line" =~ \}‖[^‖]*$ ]]; then
        [ $(echo "$line‖" | awk -F"‖" '{print NF-1}') = 3 ] && duo=false || duo=true
        new_line=$(cat "$src" | wc -l); ((new_line++))
        $duo && prefix="" || prefix="‖"; up=''; post=''
	ids="${line##*‖}"; [[ "$ids" =~ '{' ]] && ids="${ids%\}*}}" || ids=""
	n_ids=$(echo "$ids" | awk -F"{" '{print NF-1}'); [ $n_ids -eq -1 ] && n_ids=0
	case $n_ids in
	    0)	pre="${line#*{}"
	    	[ "$pre" != "$line" ] && pre="/" || pre="" ;;
	    1)	pre="/" ;;
	    *)	pre="${ids%{*}"
	    	pre="{${pre##*{}"
	    	post="${ids/$pre$param2/}" ;;
	esac
	if [ -n "$pre" ]; then
	    if [ "$pre" != '/' ]; then
		up="$pre‖$post▶"
		up="$(grep -n "$up" "$src")"
		[ -n "$up" ] && up="${up%▶*}◀ .."
	    else
		pre=""
	        ! $duo && up="0:$winicon‖multimenu $src‖◀ .." || up="0:multimenu $src‖◀ .."
	    fi
	fi
    fi
  fi
}

transfer_line () {
    dt=($(cat /tmp/hsperfdata_$USER/$type.lst))
    first_line="$(cat $src | cut -d$'\n' -f1)"
    [[ $first_line =~ ^‖[^‖]*$|^‖‖.*$ ]] && echo "$first_line" > /tmp/hsperfdata_$USER/$type.lst || rm /tmp/hsperfdata_$USER/$type.lst
    if [ $(echo "${dt[0]}‖" | awk -F"‖" '{print NF-1}') = 3 ]; then
	for ((k=0; k<${#dt[@]}; k++)); do
	  if [[ "${dt[$k]}" =~ ^[0-9]*: ]]; then
	    line="${dt[$k]%%:*}"
	    dt[$k]="$(echo "${dt[$k]#*:}" | sed "s/‖/‖$line:/")"
	    echo "${dt[$k]}" >> /tmp/hsperfdata_$USER/$type.lst
	  fi
	done
    else
	echo "${dt[*]}" >> /tmp/hsperfdata_$USER/$type.lst
    fi
}

preset () {
    if [ "$param1" = "notes" ] || [ -f /tmp/hsperfdata_$USER/multimenu-notes ]; then
	type="notes"
	arg="Memo Menu"
	winicon="$HOME/.icons/xpad.png"
	icon="$HOME/.icons/xpad.png"
    fi
    if [ "$param1" = "files" ] || [ -f /tmp/hsperfdata_$USER/multimenu-files ]; then
	type="files"
	arg="Files Menu"
	winicon="/usr/share/icons/gnome/48x48/emblems/emblem-favorite.png"
	icon=""
    fi
    if [ "$param1" = "links" ] || [ -f /tmp/hsperfdata_$USER/multimenu-links ]; then
	type="links"
	arg="Links Menu"
	winicon="$HOME/.icons/webbrowser.png"
	icon=""
    fi
    if [ "$param1" = "apps" ] || [ -f /tmp/hsperfdata_$USER/multimenu-apps ]; then
	type="apps"
	menu_edit=false
	[ ! -d "/tmp/hsperfdata_$USER/menus" ] && mkdir /tmp/hsperfdata_$USER/menus
	cp -r $HOME/.config/menus /tmp/hsperfdata_$USER
	if [ -z "$param2" ]; then
	    f_multimenu=/tmp/hsperfdata_$USER/menus/Apps.lst
	    arg="Apps Menu"
	    head="Starbuntu $(cat /usr/share/help/C/Starbuntu/index.page | grep "Version" | cut -d'<' -f 14 | cut -d\  -f3) LTS\nKernel: $(uname -r | rev | cut -c9- | rev)"
	else
	    param2="$(basename "$param2")"
	    param2="${param2/.lst/}"
	    f_multimenu="/tmp/hsperfdata_$USER/menus/$param2.lst"
	    arg="$param2 Menu"
	fi
	winicon="starbuntu-logo"
	icon=""
	edit=false
	mark="multimenu-apps"
    fi
    if [ "$param1" = "list" ] || [ -f /tmp/hsperfdata_$USER/multimenu-list ]; then
	type="list"
	f_multimenu="/tmp/hsperfdata_$USER/list.lst"
	arg="List Menu"
	winicon="$HOME/.icons/list.png"
	icon="$HOME/.icons/list.png"
	mark="multimenu-list"
    fi
}

param1="$1"; param2="$2"; head="${@:3}"
[ "$param1" = "info" ] && Info && exit 0
[ "$param1" = "apps" ] && [ -n "$param2" ] && [[ ! "$(ls $HOME/.config/menus)" =~ "$(basename "$param2")" ]] && param2=""
[ "$param1" = "apps" ] && [ -z "$param2" ] && rm /tmp/hsperfdata_$USER/multimenu-* 2>/dev/null
[ -n "$param1" ] && [ "$param1" != "apps" ] && rm /tmp/hsperfdata_$USER/multimenu-* 2>/dev/null
[ -n "$param2" ] && [ "${param2::1}" != '{' ] && [ ! -e "$param2" ] && param2="" && head="${@:2}"
[ -n "$param2" ] && list="$param2" || list="$param1"
[ -n "$list" ] && [ "$list" = "$(basename "$list")" ] && [[ ! "$list" =~ ^(apps|files|notes|links|list)$ ]] && list="$(pwd)/$list"

if [ -z "$list" ]; then
    rm /tmp/hsperfdata_$USER/multimenu-* 2>/dev/null
    [ -e "/tmp/hsperfdata_$USER/src" ] && rm /tmp/hsperfdata_$USER/src
    title="MultiMenu"
    text=$"&#10;Which list shall be opened?&#10;"
    field=$"List: "
    button1=$"Cancel"
    cd
    list=`yad --center --title="$title" --width=600 --height=200 --window-icon="$HOME/.icons/list.png" --borders=10 --text="<b>$text</b>" --text-align=center --form --field="$field":SFL "$HOME/.config/gtk-3.0" --file-filter $"List Files "" | *.lst" --button="$button1":1 --button="Info":"$0 info" --button="OK":0`
    button=$?
    [ $button -eq 1 ] && exit 1
    list="${list::-1}"
fi
if [ -n "$list" ]; then
    list="$(echo "$list" | sed "s|\$HOME|$HOME|; s|~/|$HOME/|")"
    [ "${list: -4}" != ".lst" ] && list="$list.lst"
fi

IFS=$'\n'
if [[ ! "$param1" =~ ^apps$|^notes$|^files$|^links$|^list$ ]] && [ ! -f /tmp/hsperfdata_$USER/multimenu-* ]; then
  if [ ! -e "$list" ]; then
    lang_dir=$"C"
    title="$(echo $"Create List")"
    [ -z "$list" ] && list="$HOME/New List.lst"
    text=$"&#9;You have not provided any existing list.&#10;"
    text="$text"$"&#9;So the new two items list <i>$list</i> will be created.&#10;&#9;Shall it have an own icon field?&#10;&#9;Please note: In this case you must enter only commands, files,&#10;&#9;folders or web addresses into the 'Detail' field."
    b0=$"Yes"; b1=$"No"
    cancel=$"Cancel"
    help=$"Help"
    yad --center --borders=10 --image="$HOME/.icons/list.png" --window-icon="$HOME/.icons/list.png" --title="$title" --text="$text" --button="$cancel":255 --button="$b1":1 --button=$help:"yelp /usr/share/help/$lang_dir/Starbuntu/starbuntu-apps-details.page#multimenu" --button="Info":"$0 info" --button="$b0":0    
    err=$?
    case $err in
	255) exit $err ;;
	0)   out="yad‖$(echo $"Detail&#58; " | sed -E 's/(.*)\&#58; /<\1>/')‖$(echo $"Label&#58; " | sed -E 's/(.*)\&#58; /<\1>/')" ;;
	1)   out="$(echo $"Detail&#58; " | sed -E 's/(.*)\&#58; /<\1>/')‖$(echo $"Label&#58; " | sed -E 's/(.*)\&#58; /<\1>/')" ;;
    esac
    echo "$out" > $list
    $0 $list & exit 0
  else
    menu_test="$(basename "$list")"
    menu_test="${menu_test%%.*}"
    if [ "$menu_test" = "Apps" ] || [ "${list%/*}" = "$HOME/.config/menus" ] || ([ "$(pwd)" = "$HOME/.config/menus" ] && [ "$menu_test" != "menus" ]); then
	touch /tmp/hsperfdata_$USER/multimenu-apps
	$0 apps "$list" & exit 0
    elif [[ "$menu_test" =~ notes|files|links ]]; then
	$0 $menu_test & exit 0
    else
	$0 list "$list" "$head" & exit 0
    fi
  fi
fi

menu_edit=true
f_multimenu="/tmp/hsperfdata_$USER/$(basename "$param1").lst"
edit=true
mark="multimenu-$(basename "$param1")"

preset

if [ -f /tmp/hsperfdata_$USER/multimenu-$type ]; then multimenu=true; else multimenu=false; fi

if $menu_edit; then
    if [ "$type" != "list" ]; then
	src="$HOME/.config/gtk-3.0/$type.lst"
    else
	! $multimenu && src="$param2" || src="$(cat "/tmp/hsperfdata_$USER/src")"
    fi
    echo "$src" > "/tmp/hsperfdata_$USER/src"
    if [ ! -f /tmp/hsperfdata_$USER/multimenu-$type ]; then
	cat $src | grep -v "^‖‖" | grep -v -E "^‖[^‖]*$" | grep -nE "‖[^{][^‖]*$" > /tmp/hsperfdata_$USER/$type.lst
	transfer_line
    fi
fi

if ! $multimenu; then
    touch /tmp/hsperfdata_$USER/$mark
    if $menu_edit; then list-cmd-edit --list=$f_multimenu --arg=$arg --head="$head" --winicon=$winicon --icon=$icon --parent="$0" --deco=true --edit=$edit; else list-cmd-edit --list=$f_multimenu --arg=$arg --head="$head" --winicon=$winicon --parent="$0" --deco=true --edit=$edit; fi
    exit_code=$?
    if [ $exit_code -ge 3 ] || [ $exit_code -eq 252 ]; then rm /tmp/hsperfdata_$USER/multimenu-$type; [ -e "/tmp/hsperfdata_$USER/src" ] && rm /tmp/hsperfdata_$USER/src; exit $exit_code; fi
else
    ctg="$param2 Menu"
    if ! $menu_edit; then
	if [ -f "$HOME/.config/menus/$param2.lst" ]; then
	    add_up
	else
	    eval "$param2"
	    exit 0
	fi
	edit=false
     else
	found="$(cat "$src" | grep -v "^‖‖" | grep -v -E "^‖[^‖]*$" | grep -n "$param2[^{^‖]*$")"
	[ -n "$found" ] && echo "$found" > /tmp/hsperfdata_$USER/$type.lst || cat "$src" | grep -n "$param2.*$" > /tmp/hsperfdata_$USER/$type.lst
	[ ! -e "/tmp/hsperfdata_$USER/menus.lst" ] && add_up
	[ -z "$found" ] && echo "$new_line:${prefix}Detail‖$ids${param2}Label" > /tmp/hsperfdata_$USER/$type.lst && echo "${prefix}Detail‖$ids${param2}Label" >> $src
	sed  -i "1i $up" /tmp/hsperfdata_$USER/$type.lst
	transfer_line
	list=/tmp/hsperfdata_$USER/$type.lst
	ctg="$(echo "$ctg" | sed 's/{//g; s/}//g')"
    fi
    list-cmd-edit --list=$list --arg=$ctg --head="$head" --winicon=$winicon --icon=$icon --parent="$0" --deco=true --edit=$edit 2>/dev/null
    exit_code=$?
    if [ $exit_code -eq 3 ] || [ $exit_code -eq 252 ]; then rm /tmp/hsperfdata_$USER/multimenu-$type; [ -e "/tmp/hsperfdata_$USER/src" ] && rm /tmp/hsperfdata_$USER/src; fi
fi

exit 0

