#!/bin/bash

Info () {
title="Info"
author="Peter Starfinger"
mail="E-Mail: info@die-starfingers.de"
year="2020"
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
}


[ "$1" = "info" ] && Info && exit 0
d_file="$1"
. $HOME/.config/openbox/environment
title="exec-desktop"
text="$(echo $"&#10;Which desktop file shall be opened?&#10;")"
field=$"File: "
button=$"Cancel"
[ -z "$d_file" ] && [ -n "$(xsel -p)" ] && d_file="$(xclip -o -se p)"
if [ -z "$d_file" ]; then
  d_file=`yad --center --title="$title" --width=600 --height=200 --window-icon="$HOME/.icons/apwal.png" --borders=10 --text="<b>$text</b>" --text-align=center --form --file-filter="*.desktop" --file-filter="*" --field="$field":SFL "$HOME/.local/share/applications" --button="$button":1 --button="Info":"$0 info" --button="OK":0`
  knopf=$?
  [ $knopf -ne 0 ] && exit $knopf
  [ -n "$d_file" ] && d_file="${d_file::-1}" && d_file="$(echo "$d_file" | sed "s|\$HOME|$HOME|; s|~/|$HOME/|")" || exit 1
fi
[[ "$d_file" =~ ".desktop" ]] && ext="" || ext=".desktop"
if [ ! -f "$d_file" ] || [ ! "$(xdg-mime query filetype "$d_file")" = "application/x-desktop" ]; then d_file=$d_file$ext; fi
if [ "$d_file" = "$(basename "$d_file")" ]; then
    dfile="$HOME/.local/share/applications/$d_file"
    [ -f "$dfile" ] && d_file="$dfile" || dfile="/usr/share/applications/$d_file"
    [ -f "$dfile" ] && d_file="$dfile"
fi

if [ -f "$d_file" ]; then

  while read line; do
    if [ "${line:0:4}" = "Exec" ]; then
        break
    fi
  done < "$d_file"

  if [ "${line:0:4}" = "Exec" ]; then
    line="${line/Exec=/}"
    params="$@"" "
    params="${params/$1 }"
    files=()
    if [[ "$line" =~ %[UuFf] ]] && [ -n "$params" ] && [[ ! "$params" =~ "://"|mailto: ]]; then
	exp_file=true
    else
	line="$(echo $line)"
	exp_file=false
    fi
    parameters="$params"
    if $exp_file; then
	types=($(cat $HOME/.config/gtk-3.0/recent.types))
	IFS=$'\n'
	h_file="$HOME/.config/gtk-3.0/recent.history"
	[ ! -f "$h_file" ] && touch $h_file
	lines_h_file=$(cat $h_file | wc -l)
	[ $lines_h_file -gt $max_recent_lines ] && echo "$(cat $h_file | head -n $max_recent_lines)" > $h_file
	hist=($(cat "$h_file"))
	type=false
	params="$params "; par=""
	while [ -n "$params" ]; do
	    [ -n "$par" ] && par="$par ${params%% *}" || par="${params%% *}"; params="${params#* }"
	    if [ -e "$par" ]; then
		par_type=$(xdg-mime query filetype "$par")
		[ "$par_type" = "application/x-trash" ] && par_type=$(file --mime-type "$par") && par_type="${par_type#*: }"
		r_type=false
		for t in ${types[@]}; do [[ "$par_type" =~ "$t" ]] && r_type=true && type=true && break; done
		if $r_type; then
		    k=$(grep -n "^$par$" <<< "${hist[*]}" | head -1 | cut -d: -f1)
		    while [ -n "$k" ]; do
			unset "hist[$((k-1))]"
			hist=(${hist[@]})
			k=$(grep -n "^$par$" <<< "${hist[*]}" | head -1 | cut -d: -f1)
		    done
		    hist=("$par" ${hist[@]})
		    if [ ${#hist[@]} -gt $max_recent_lines ]; then
			unset "hist[((${#hist[@]}-1))]"
		    fi
		fi
		[[ "$par" =~ " " ]] && files=(${files[@]} \"$par\") || files=(${files[@]} "$par")
		par=""
	    elif [[ "$par" =~ https?:|s?ftps?:|ssh:|davs?:|file:|mailto: ]]; then
		files=(${files[@]} $par)
	    fi
	done
	if $type; then
	    rm "$h_file"
	    echo "${hist[*]}" > $h_file
	    cp -f $h_file $h_file.bak
	fi
    fi
    [ "${#files[@]}" -eq 0 ] && if [ "${parameters: -1}" = " " ]; then files=(${parameters::-1}); else files=($parameters); fi

    if $exp_file; then
	line="$(echo "$line" | sed "s'%[UuFf]'%'")"
	line="${line/\%/${files[@]}}"
	line="$(echo "$line" | sed -E 's!=\"\"([^\"^;]*)\"\";!=\"\\"\1\\"\";!')"
    else
	[ -n "$params" ] && line="$(echo "$line" | sed -E "s^%[UuFf]^${params//&/\\&}^; s' http(.[^ ]*)' \"http\1\"'g; s~ mailto:(.[^ ]*)~ mailto:\"\1\"~g")" || line="$(echo "$line" | sed 's@%[UuFf]@@')"
    fi
    line="${line//\$HOME/~}"
    line="$(echo "$line" | sed -E "s!([^=])\~!\1$HOME!g")"
#    echo "$line" > ~/debug
    if [[ $(cat "$d_file") =~ "Terminal=true" ]] && [[ ! "$line" =~ "xterm" ]]; then
	xterm -e $line
    else
	eval $line
    fi
  fi
else
  file="$(basename $d_file)"
  error=$"&#10;    The file '$file'&#10;    doesn't exist!&#10;&#10;"

  yad --center --fixed --title="$title" --window-icon="$HOME/.icons/apwal.png" --borders=20 --image="dialog-warning" --text="$error" --button="OK":0
fi

exit $?

