#!/bin/sh

file="$1"

if ! [ -e "$file" ] ; then
	echo "Die Datei '$file' existiert nicht"
	exit 1
fi

file="$( realpath --no-symlinks -- "$file" )"

KIND="f"
IS_SYMLINK=""

OWNER_ID="$( stat --format=%u -- "$file" )"
OWNER_NAME="$( stat --format=%U -- "$file" )"

containing_directory="$( realpath --no-symlinks -- "$file" | sed -e 's|/[^/]+/?$||' )"

real_file="$(realpath -- "$file")"

COLOR_EM="$(printf "\033[01m")"
COLOR_YES="$(printf "\033[32;01m")"
COLOR_NO="$(printf "\033[31m")"
COLOR_PATH="$(printf "\033[35m")"
COLOR_N="$(printf "\033[00m")"

echo "Versuche Brechtigungen für folgenden Dateipfad zu erklären:"
echo "    ${COLOR_PATH}${file}${COLOR_N}"
echo

if [ -L "$file" ] ; then
	echo "Das ist eine ${COLOR_EM}symbolische Verknüpfung${COLOR_N}, siezeigt auf folgenden Dateipfad:"
	echo "    ${COLOR_PATH}${real_file}${COLOR_N}"
	echo
	IS_SYMLINK="y"
fi

if [ "$file" = "/" ] ; then
	echo "Das ist das ${COLOR_EM}Wurzelverzeichnis${COLOR_N} des Dateisystems"
	exit
elif [ -d "$file" ] ; then
	echo "Das ist ein ${COLOR_EM}Verzeichnis${COLOR_N}"
	KIND="d"
elif [ -f "$file" ] ; then
	echo "Das ist eine ${COLOR_EM}reguläre Datei${COLOR_N}"
else
	echo "Das ist eine ${COLOR_EM}besonderer Dateityp${COLOR_N}, diesen kann ich leider nicht erklären."
	exit
fi


IS_READABLE=""
if [ -r "$real_file" ] ; then
	IS_READABLE="y"
fi
IS_WRITABLE=""
if [ -w "$real_file" ] ; then
	IS_WRITABLE="y"
fi
IS_EXECUTABLE=""
if [ -x "$real_file" ] ; then
	IS_EXECUTABLE="y"
fi
IS_OWNER=""
if [ "$OWNER_ID" = "$(id -u)" ] ; then
	IS_OWNER="y"
fi
IS_CONTAINING_READABLE=""
if [ -r "$containing_directory" ] ; then
	IS_CONTAINING_READABLE="y"
fi
IS_CONTAINING_WRITABLE=""
if [ -w "$containing_directory" ] ; then
	IS_CONTAINING_WRITABLE="y"
fi

# (start_of_sentence)
print_diretory_dependent_permissions() {
	start_of_sentence="$1"
	if [ -n "$IS_SYMLINK" ] ; then
		start_of_sentence="Die Verknüpfung"
	fi
	if [ -n "$IS_CONTAINING_WRITABLE" ] ; then
		echo "* $start_of_sentence ${COLOR_YES}umbenennen${COLOR_N}, ${COLOR_YES}verschieben${COLOR_N} und ${COLOR_YES}löschen${COLOR_N}"
	else
		echo "* $start_of_sentence weder ${COLOR_NO}umbenenen${COLOR_N} noch ${COLOR_NO}verschieben${COLOR_N} noch ${COLOR_NO}löschen${COLOR_N}"
	fi
	echo "  (Diese Berechtigungen leiten sich aus dem übergeordneten Verzeichnis ab)"
}

echo
echo "Du kannst damit folgende Dinge tun:"
case "$KIND" in
	f)
		if [ -n "$IS_READABLE" ] && [ -n "$IS_WRITABLE" ] ; then
			echo "* Die Datei ${COLOR_YES}lesen${COLOR_N} und ${COLOR_YES}schreiben${COLOR_N}"
		elif [ -n "$IS_READABLE" ] ; then
			echo "* Die Datei nur ${COLOR_YES}lesen${COLOR_N}"
		elif [ -n "$IS_WRITABLE" ] ; then
			echo "* Die Datei ${COLOR_YES}schreiben${COLOR_N}, aber nicht ${COLOR_NO}lesen${COLOR_N}"
		else
			echo "* Die Datei weder ${COLOR_NO}lesen${COLOR_N} noch ${COLOR_NO}schreiben${COLOR_N}"
		fi
		print_diretory_dependent_permissions "Die Datei"
		if [ -n "$IS_EXECUTABLE" ] ; then
			echo "* Die Datei ist als ${COLOR_YES}ausführbar${COLOR_N} markiert"
		else
			echo "* Die Datei nicht ${COLOR_NO}ausführen${COLOR_N}"
		fi
		if [ -n "$IS_OWNER" ] ; then
			echo "* Die Datei gehört dir, du kannst ihre ${COLOR_YES}Berechtigungen${COLOR_N} selbst verändern"
		else
			echo "* Die Datei gehört ${COLOR_PATH}${OWNER_NAME}${COLOR_PATH}"
		fi
		;;
	d)
		if [ -n "$IS_READABLE" ] && [ -n "$IS_EXECUTABLE" ] ; then
			echo "* Den Inhalt des Verzeichnisses ${COLOR_YES}auflisten${COLOR_N}"
		elif [ -n "$IS_READABLE" ] ; then
			echo "* Auf die Inhalte des Verzeichnisses ${COLOR_YES}mit ihrem exakten Namen zugreifen${COLOR_N}, aber nicht die Inhalte des Verzeichnisses ${COLOR_NO}auflisten${COLOR_N}."
		else
			echo "* Nicht auf die Inhalte des Verzeichnisses ${COLOR_NO}zugreifen${COLOR_N}"
		fi
		if [ -n "$IS_WRITABLE" ] ; then
			echo "* Dateien in diesem Verzeichnis ${COLOR_YES}ablegen${COLOR_N}, ${COLOR_YES}umbenennen${COLOR_N}, ${COLOR_YES}verschieben${COLOR_N} oder ${COLOR_YES}löschen${COLOR_N}"
		fi
		print_diretory_dependent_permissions "Das Verzeichnis"
		if [ -n "$IS_OWNER" ] ; then
			echo "* Das Verzeichnis gehört dir, du kannst seine ${COLOR_YES}Berechtigungen${COLOR_N} selbst verändern"
		else
			echo "* Das Verzeichnis gehört ${COLOR_PATH}${OWNER_NAME}${COLOR_PATH}"
		fi
		;;
esac
