#!/bin/bash

Info () {
local app
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
}

success=false
parameters="$@"
[ "$1" = "info" ] && Info && exit 0

parameters=$(quote-files-in-string $parameters)
# [[ "$parameters" != "$@" ]] && parameters=${parameters//\"/\\\\\"} && echo $parameters | xargs $0 && exit 0 #"
# echo ${1//\\/\"} | sed 's~\"\"~\"~g' #"
title="all-open"
if [ -z "$parameters" ] || [ "$parameters" = '%U' ]; then
    text='\n'"$(echo $"Which address(es) shall be opened?")"'\n'
    field="$(echo $"Address(es)"): "
    button1=$"Cancel"
    cd
    entries=`yad --center --title="$title" --width=600 --height=200 --window-icon="$HOME/.icons/bottle-opener.png" --borders=10 --text="<b>$text</b>" --text-align=center --form --item-separator=" " --field="$field":MFL --button="$button1":1 --button="Info":"$0 info" --button="OK":0`
    [ $? -eq 0 ] && entries="$(echo "$entries" | sed "s|\$HOME|$HOME|; s|~/|$HOME/|")" && entries="$(esc-files-in-string ${entries/\|/})" && $0 $entries &
    exit 0
fi

if [ -z "$parameters" ]; then
    exit 0
else
    env_var=""
    param="$1"
    h_file="$HOME/.config/x-scheme-handlers"
    handlers="$(cat $h_file)"
    hdl=""; for h in $handlers; do hdl="$hdl"\|$(echo "$h" | cut -d/ -f2 | cut -d= -f1)://; done
    hdl="${hdl/mailto:\/\//mailto:}"
    hdl="^(${hdl:1})"
    hdl_net="${hdl%:\|*}:)"
    hdl_not_net="^(${hdl#*:\|}" 
    while [[ "$param" =~ "=" ]] && [[ ! "$param" =~ $hdl_net ]]; do
	env_var="$env_var $param"
	parameters=$(echo ${parameters/$1/})
	shift
	param="$1"
    done
    addr=(); k=0
fi

until [ -z "$parameters" ]; do
    param=$(echo "$parameters" | sed -E 's~(\"?[^\"]*\").*~\1~')
    [ "${param: -2}" = " \"" ] && param="${param::-2}"
    [[ ! "$param" =~ ^bridge$|^cat$|^false$|^kill$|^man$|^more$|^mount$|^raw$|^red$|^sleep$|^top$|^touch$|^true$|^which$ ]] && param_path=$(which $param)
    parameters=$(echo ${parameters/$param/})
    warning='\n'$"Address '$param' faulty!"
    found=true
    if [[ "$param" =~ $hdl ]]; then
	    net=true
	    prot="${param%%:*}"
	    case "$param" in
		http://*|https://* ) param="$(echo "$param" | sed -E "s'http(.[^ ]*)'\"http\1\"'g")" ;; #"
		mailto:* ) param="$(echo "$param" | sed -E "s~mailto:(.[^ ]*)~mailto:\"\1\"~g")" ;;  #"
	    esac
	    addr[$k]="$(echo "$param" | sed -E "s/\{&/\&/g; s/&\}/\&/g")"
	    [[ "$param" =~ $hdl_not_net ]] && addr[$k]=""
	    handler="x-scheme-handler/$prot"
	    desktop_file[$k]="$(xdg-mime query default $handler)"
	    handler="$(grep /${prot}= $h_file)"
	    if [ -z "${desktop_file[$k]}" ] || [[ ! "$handler" =~ "${desktop_file[$k]}" ]]; then
		[ -n "$handler" ] && desktop_file[$k]="${handler#*=}"
	    fi
    else
	    net=false
	    param="${param//\"/}"
	    if [[ ! -e "$param" ]]; then
		if [ -e "$param_path" ]; then
		    param="$param_path"
		else
		    param=$(echo "$param" | awk '{$1=$1};1')
		    yad --center --fixed --title="$title" --borders=10 --window-icon="$HOME/.icons/bottle-opener.png" --image="dialog-warning" --text="$warning" --button="OK"
		    found=false
		fi
	    fi
	    if $found; then
		addr[$k]="$param"
		addr_type[$k]=$(xdg-mime query filetype "${addr[$k]}")
		err=$?
		if [ $err -eq 0 ]; then
		    [ "${addr_type[$k]}" = "application/x-trash" ] && addr_type[$k]=$(file --mime-type "${addr[$k]}") && addr_type[$k]="${addr_type[$k]#*: }"
		    desktop_file[$k]=$(xdg-mime query default ${addr_type[$k]})
		else
		    desktop_file[$k]=""
		fi
		[ -z "${desktop_file[$k]}" ] && warning=$"&#10;    The file '${addr[$k]}'&#10;    cannot be opened because&#10;    its file type '${addr_type[$k]}'&#10;    is not assigned to any application!&#10;&#10;" && yad --center --fixed --title="$title" --borders=10 --window-icon="$HOME/.icons/bottle-opener.png" --image="dialog-warning" --text="$warning" --button="OK" && exit 1
		[[ "${addr[$k]}" =~ " " ]] && addr[$k]=\"${addr[$k]}\" #"
	    fi
    fi
    if $found; then
	if [ -f "$HOME/.local/share/applications/${desktop_file[$k]}" ]; then
	    desktop_file[$k]="$HOME/.local/share/applications/${desktop_file[$k]}"
	else
	    desktop_file[$k]="/usr/share/applications/${desktop_file[$k]}"
	fi
	[[ "${desktop_file[$k]}" =~ "exec-desktop" ]] && line[$k]="exec-desktop" || line[$k]="exec-desktop ${desktop_file[$k]}"
	((k++))
    fi
done

l=${#addr[@]}; index=()
for ((i=0; i<$l; i++)); do index[$i]=$i; done
until [ ${#index[@]} -eq 0 ]; do
    collect=""
    app="${line[${index[0]}]}"
    if [ -n "$app" ]; then
	for ((i=0; i<$l; i++)); do
	    if [ "${line[${index[$i]}]}" = "$app" ]; then
		collect="$collect${addr[${index[$i]}]} "
		unset index[$i]
	    fi
	done
    else
	unset index[$i]
    fi
    index=(${index[@]})
    l=${#index[@]}
    collect=$(echo "$collect" | awk '{$1=$1};1')
    if $net; then
	eval "$app $collect"
    else
	[ -z "$collect" ] && exit 0
	if [ -z "$env_var" ]; then
	    of="$app $collect &"
	else
	    of="$env_var $app $collect &"
	fi
	eval $of
    fi
done
