#!/bin/bash

Info () {
title="Info"
author="Peter Starfinger"
mail="E-Mail: info@die-starfingers.de"
year="2023"
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'"$year"$'\n' --text-align=center --selectable-labels --button="OK" &
wunwa "$title" > /dev/null; xdotool key Home key Down
}

param="$1"
[ "$param" = "info" ] && Info && exit 0

lang_dir=$"C"
if [ -z "$1" ]; then
    title=$"List Structurer"
    text=$"&#10;Which list?&#10;"
    field1=$"List: "
    cbe=$"File Exposition"" Menu"
    button1=$"Cancel"
    button2=$"Help"
    cd
    list=`yad --center --title="$title" --width=600 --height=200 --window-icon="format-indent-less-rtl" --borders=10 --text="<b>$text</b>" --text-align=center --form --item-separator="‖" --field="$field1":CBE "Memo Menu‖$cbe‖Url Exposition Menu" --button="$button1":1 --button=$button2:"yelp /usr/share/help/$lang_dir/Starbuntu/starbuntu-apps-details.page#mk-rec-rm-identifier" --button="Info":"$0 info" --button="OK":0`
    button=$?
    [ $button -eq 1 ] && exit 1 || list="${list::-1}"
    case $list in
	Memo*)		list="notes" ;;
	Datei*|File*)	list="files" ;;
	Url*)		list="links" ;;
    esac
else
    list="$1"
fi
list="$(echo "$list" | sed "s|\$HOME|$HOME|; s|~/|$HOME/|")"

IFS=$'\n'
case $list in
    notes) f_menu="$HOME/.config/gtk-3.0/notes.lst" ;;
    files) f_menu="$HOME/.config/gtk-3.0/files.lst" ;;
    links) f_menu="$HOME/.config/gtk-3.0/links.lst" ;;
    list ) f_menu="$2" ;;
    *    ) f_menu="$list" ;;
esac
if [ ! -e "$f_menu" ]; then
    title=$"Create List"
    [ -z "$f_menu" ] && f_menu=$HOME/$"New List"
    text=$"&#9;The list doesn't yet exist.&#10;"$"&#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=format-indent-less-rtl --title="$title" --text="$text" --button="$cancel":255 --button="$b1":1 --button=$help:"yelp /usr/share/help/$lang_dir/Starbuntu/starbuntu-apps-details.page#mk-rec-rm-identifier" --button="Info":"$0 info" --button="$b0":0    
    err=$?
    case $err in
	255) exit $err ;;
	0)   echo "run‖run‖Label" > $f_menu ;;
	1)   echo "Detail‖Label" > $f_menu ;;
    esac
fi

no_ids=false
cont="$(cat "$f_menu")"
id_fs=($(grep '}‖' <<< $cont))
for ((i=0; i<${#id_fs[*]}; i++)); do
    label="${id_fs[$i]##*‖}"
    label="${label##*\}}"
    detail="${id_fs[$i]%‖*}"
    detail="${detail##*‖}"
    cont="$(echo "$cont" | sed "s!$detail!{$label|${detail:1}!g")"
done

id_fs=($(grep -n '}‖' <<< $cont))
for ((i=0; i<${#id_fs[*]}; i++)); do
    nr="${id_fs[$i]%%:*}"
    id_fs[$i]="${id_fs[$i]#*:}":$nr
done

[ -z "${id_fs[*]}" ] && id_fs=($(cat $f_menu)) && no_ids=true
[ $(echo "${id_fs[0]}‖" | awk -F"‖" '{print NF-1}') = 2 ] && duo=true || duo=false
$no_ids && id_fs=()

idf=($(for ((i=0; i<${#id_fs[*]}; i++)); do
    label="${id_fs[$i]##*‖}"
    detail="${id_fs[$i]%‖*}"
    detail="${detail##*‖}"
    [ "${label::1}" = "{" ] && line="${label%\}*}}!$detail!‖$label" || line="$detail!!‖$label"
    echo "$line"
done | sort -t'!' -k 1,1 -k 2,2 --ignore-case))

id_fs=($(echo "${id_fs[*]}" | sed -E "s!\{[^\|]*\|!{!g"))
idf=($(echo "${idf[*]}" | sed -E "s!\{[^\|]*\|!{!g"))

main_id=$"Main identifier:0"
idf=($main_id ${idf[@]//\!/})
h=${#idf[@]}; h=$(((h+11)*20))

IFS='¦'
id_f=($(for ((i=0; i<${#idf[*]}; i++)); do
    idf[$i]="${idf[$i]##*:}¦${idf[$i]##*‖}"
    echo "${idf[$i]%:*}¦"
done))
id_f=($(echo "${id_f[*]}" | sed 's/{[^}]*}/    /g'))

title=$"Select an identifier"
text=$"Select the place of the new identifier&#10;resp. the identifier to be recorded or deleted:"
error=$"&#10;    Main level not removable!&#10;"
deltext=$"Del!!Delete identifier"
oktext=$"Create!!there as sub-identifier"
rec=$"Record!!in list elements"
button2=$"Help"

name=`yad --center --title="$title" --window-icon=format-indent-less-rtl --width=350 --height=$h --borders=20 --text="$text"$'\n' --list --no-headers --column="Idf":HD --column="Identifiers" ${id_f[@]} --button=$"Quit":1 --button="$deltext":2 --button="$button2":"yelp /usr/share/help/$([ $LANGUAGE != "en" ] && echo "$LANGUAGE" || echo "C")/Starbuntu/starbuntu-apps-details.page#mk-rec-rm-identifier" --button="Info":"$0 info" --button="$rec":4 --button="$oktext":0`
exit_code=$?

[ $exit_code -eq 1 ] && exit 1
[ $exit_code -eq 4 ] && trans=true || trans=false
[ $exit_code -eq 0 ] && create=true || create=false
[ $exit_code -eq 2 ] && del=true || del=false

IFS=$'\n'
name="${name//$'\n'/}"
if $trans || $del || $create; then
    cp $f_menu $f_menu.bak
    n_id=${name%%\|*}
    label="${name#*▶ }"; label="${label::-1}:$n_id$"
    id="$(echo "${idf[*]}" | grep -E "$label")" # "
    [ -z "$id" ] && $del && yad --center --title=$"Error" --fixed --window-icon=format-indent-less-rtl --image="dialog-warning" --borders=20 --text="$error" --button="OK" && exit 2
    id="${id%‖*}"
    id="{${id##*\{}"
    [ $n_id -eq 0 ] && id="" && label="${label#*|}"
    super_id="$(echo "${idf[*]}" | grep -E "$label")" # "
    super_id="${super_id%%‖*}"
    [ $n_id -eq 0 ] && super_id=""
    name="${name#*|}"
    name="$(echo "$name" | sed 's/^ *//g; s/|//g')"
    if $del; then
	sed -i "${n_id}d" $f_menu
	if [ -n "$(grep "$id" "$f_menu")" ]; then # "
	    title="$(echo $"Removal of an identifier")" # "
	    text="$(echo $"&#9;There are entries under the identifier to be removed.&#10;&#9;Remove entries, too?&#10;&#9;Otherwise they get moved upwards for one identifier level.&#10;")"
	    no=$"No"; yes=$"Yes"
	    yad --center --fixed --title="$title" --window-icon="format-indent-less-rtl" --image="dialog-question" --borders=20 --text="$text" --button="$no":1 --button="$yes":0
	    knopf=$?
	    [ $knopf -eq 0 ] && sed -i "/$id/d" $f_menu || sed -i "s/$id//g" "$f_menu"
	fi
    else
      if $create; then
	text=$"Place of identifier: "
	title=$"Set Identifier Parameters"
	button1=$"Cancel"
	field1=$"New identifier's label: " #'
	field2=$"New identifier (optional): "
	field3=$"Icon: "
	cd /usr/share/icons/Humanity/categories/48/
	if $duo; then
	    entry=`yad --center --title="$title" --width=600 --height=200 --window-icon="format-indent-less-rtl" --borders=10 --text="<b>$text$name</b>" --text-align=center --form --separator="¦" --field="$field1" "" --field="$field2" "" --button="$button1":1 --button="$button2":"yelp /usr/share/help/$([ $LANGUAGE != "en" ] && echo "$LANGUAGE" || echo "C")/Starbuntu/starbuntu-apps-details.page#mk-rec-rm-identifier" --button="Info":"$0 info" --button="OK":0`
	else
	    entry=`yad --center --title="$title" --width=600 --height=200 --window-icon="format-indent-less-rtl" --borders=10 --text="<b>$text$name</b>" --text-align=center --form --separator="¦" --field="$field1" "" --field="$field2" "" --field="$field3":SFL --file-filter $"Graphic Files "" | *.svg *.png *.SVG *.PNG" --add-preview --button="$button1":1 --button="$button2":"yelp /usr/share/help/$([ $LANGUAGE != "en" ] && echo "$LANGUAGE" || echo "C")/Starbuntu/starbuntu-apps-details.page#mk-rec-rm-identifier" --button="Info":"$0 info" --button="OK":0`
	fi
	exit_code=$?
	[ $exit_code -eq 1 ] && exit $exit_code
	name="▶ ${entry%%¦*}"; entry="${entry#*¦}"
	id="${entry%%¦*}"; entry="${entry#*¦}"
	id="$(echo "$id" | sed 's/{//; s/}//')"
	while [[ "${id_fs[*]}" =~ "{$id}" ]]; do
	    id="${id}_"
	done
	if [ -z "$id" ]; then
	    k=0
	    until [[ ! "${id_fs[@]}" =~ "{$k}" ]]; do ((k++)); done
	    id="$k"
	fi
	id="$(echo "{$id}" | sed 's/{{/{/g; s/}}/}/g')"
	icon="${entry%%¦*}"
	new_entry="$id‖$super_id$name"
	! $duo && new_entry="$icon‖$new_entry"
	echo "$new_entry" >> "$f_menu"
      fi
      title=$"Input Identifier"
      text=$"Input identifier with label $name in:&#10;"
      cancel=$"Cancel"
      hyper_id="$(echo "$super_id" | sed 's/}{/}|{/g')"
      non_id_fs=($(grep -nvE $id[^\{] $f_menu | grep -vE "\($hyper_id\)‖"))
      if $trans; then
	id=""
	[ "$name:0" = $"Main identifier:0" ] && non_id_fs=($(grep -nvE "‖[^\{]*$" $f_menu))
      fi
      non_idf=($(for ((i=0; i<${#non_id_fs[*]}; i++)); do
		label="${non_id_fs[$i]##*‖}"
		label="${label##*\}}:${non_id_fs[$i]%%:*}"
		echo "$label"
	    done | sort))

      IFS='¦'
      non_id_f=($(for ((i=0; i<${#non_idf[*]}; i++)); do
			non_idf[$i]="${non_idf[$i]##*:}¦${non_idf[$i]%:*}"
			echo "${non_idf[$i]}¦"
		  done))
      h=${#non_id_f[@]}; h=$(((h+11)*20))
      [ $h -gt 700 ] && h=700

      selected_entries=`yad --center --title="$title" --window-icon=format-indent-less-rtl --width=600 --height=$h --borders=20 --text="$text" --list --multiple --no-headers --column="ids":HD --column="Labels" --search-column=2 --regex-search ${non_id_f[@]} --button="$cancel":1 --button="$button2":"yelp /usr/share/help/$([ $LANGUAGE != "en" ] && echo "$LANGUAGE" || echo "C")/Starbuntu/starbuntu-apps-details.page#mk-rec-rm-identifier" --button="Info":"$0 info" --button="OK":0`
      exit_code=$?
      if [ $exit_code -eq 0 ]; then
	    IFS=$'\n'
	    for s in $selected_entries; do
		nr="${s%%|*}"
		old_line="$(sed "${nr}q;d" $f_menu)"
		new_line="$(echo "$old_line" | sed -E "s/(‖?.*‖)\{.*\}([^‖]*)$/\1$super_id$id\2/")"
		if [ "$new_line" = "$old_line" ]; then
		    pre="${old_line%‖*}"
		    post="${old_line##*‖}"
		    new_line="$pre‖$super_id$id$post"
		fi
		sed -i "${nr}c $new_line" $f_menu
		if [[ "$new_line" =~ "}‖" ]]; then
		    $create &&	super_id="$super_id$id"
		    id="$(echo "$new_line" | sed -E "s/.*\{(.*)\}‖[^‖]*$/{\1}/")"
		    dep_entries=($(grep -n $id $f_menu | grep -v "$id‖"))
		    for d in ${dep_entries[@]}; do
			nr="${d%%:*}"
			old_line="$(sed "${nr}q;d" $f_menu)"
			[[ "$old_line" =~ "‖$id" ]] && prefix="" || prefix="\{[^‖]*\}"
			new_line="$(echo "$old_line" | sed -E "s/$prefix\{${id:1:-1}\}([^‖]*)$/$super_id$id\1/")"
			sed -i "${nr}c $new_line" $f_menu
		    done
		fi
	    done
	fi
    fi
fi

exit 0
