#!/bin/bash

function callPortal() {
	exec 114< "${link}"
	if [[ -L "${link}" ]]; then
		return 1
	elif [[ -d "${link}" ]] || [[ ${showItem} ]]; then
		if [[ -w "${link}" ]]; then
			echo "Opening directory via Portal"
		elif [[ -w "$(dirname "${link}")" ]] && [[ ${showItem} ]]; then
			echo "Opening directory via Portal"
		else
			echo "Error: path not writable"
			return 1
		fi
		busctl \
			--user \
			call \
			org.freedesktop.portal.Desktop \
			/org/freedesktop/portal/desktop \
			org.freedesktop.portal.OpenURI \
			OpenDirectory \
			sha{sv} \
			'parent_window' \
			'114' \
			3 handle_token s 0 writable b false ask b true
		if [[ $? = 0 ]]; then
			exit 0
		fi
	else
		if [[ -w "${link}" ]]; then
			echo "Opening file via Portal"
		else
			echo "Error: path not writable"
			return 1
		fi
		busctl \
			--user \
			call \
			org.freedesktop.portal.Desktop \
			/org/freedesktop/portal/desktop \
			org.freedesktop.portal.OpenURI \
			OpenFile \
			sha{sv} \
			'parent_window' \
			'114' \
			3 handle_token s 0 writable b false ask b true
		if [[ $? = 0 ]]; then
			exit 0
		fi
	fi
}

echo "Received arguments: $*"

if [[ $1 = "--show-item" ]]; then
	shift
	declare -g -i showItem
	showItem=1
fi

if [[ "$1" =~ ://.*  ]]; then
	if [[ $1 =~ ^file:// ]]; then
		echo "That's a file link!"
		declare -g origReq
		origReq="$(echo "$1" | sed 's|file:///|/|g')"
		echo "Decoding path as: ${origReq}"
	else
		echo "Querying the portal..."
		declare schemeSupported
		schemeSupported=$(busctl --user call org.freedesktop.portal.Desktop /org/freedesktop/portal/desktop org.freedesktop.portal.OpenURI SchemeSupported "sa{sv}" "$(echo "${1}" | sed 's|://.*||g')" 0)
		if [[ "${schemeSupported}" =~ false$ ]]; then
			echo "Warning: the link is not supported by this system"
			exit 1
		fi
		busctl \
			--user \
			call \
			org.freedesktop.portal.Desktop \
			/org/freedesktop/portal/desktop \
			org.freedesktop.portal.OpenURI \
			OpenURI \
			"ssa{sv}" \
			'parent_window' "$*" 3 handle_token s 0 writable b false ask b true
		exit $?
	fi
else
	declare -g origReq
	origReq="$*"
fi

if [ "${trashAppUnsafe}" ]; then
	link="${origReq}"
	xdg-open "${origReq}"
	exit $?
fi

if [[ "${origReq}" =~ "/tmp" ]]; then
	echo "[Info] Detected /tmp!"
	cp \
		-a \
		"${origReq}" \
		~/Shared/
	link="${HOME}/Shared/$(basename "${origReq}")"
elif [[ "${origReq}" =~ ^/run/user ]]; then
	echo "[Info] Detected run path!"
	cp \
		-a \
		"${origReq}" \
		~/Shared/
	link="${HOME}/Shared/$(basename "${origReq}")"
elif [[ "$(dirname "${origReq}")" =~ ^${HOME} ]]; then
	echo "[Info] Detected sandbox home"
	link="${origReq}"
else
	showItem=1
	link="${HOME}/Shared/$(basename "${origReq}")"
	ln \
		-sfr \
		"${origReq}" ~/Shared/
fi

echo "[Info] received a request: $*, translated to ${link}"

declare -g link
echo "[Info] Initiating D-Bus call..."

callPortal

dbus-send --print-reply --dest=org.freedesktop.FileManager1 \
	/org/freedesktop/FileManager1 \
	org.freedesktop.FileManager1.ShowItems \
	array:string:"file://${link}" \
	string:fake-dde-show-items

if [[ $? -eq 0 ]]; then
	exit 0
fi
xdg-open $(dirname "${link}")
