#!/bin/bash
pidof -sq -o %PPID -x "$(basename "$0")" && exit
datastore="$HOME"/.local/share/fix-zombie-appicons
bakdir="$datastore"/backup
data="$datastore"/tweaked-desktop-files

# Directories where desktop files are stored
user="$HOME"/.local/share/applications
pacman_global=/usr/share/applications
pacman_local=/usr/local/share/applications
flatpak_global=/var/lib/flatpak/exports/share/applications
flatpak_local="$HOME"/.local/share/flatpak/exports/share/applications
snap=/var/lib/snapd/desktop/applications

mkdir -p "$bakdir" "$user" "$flatpak_local" ||
	{ echo "failed to make directoris $bakdir, $user & $flatpak_local"; exit 1; }

detectfiles() {
	for file in "$user"/*.desktop; do
		name=$(basename "$file") || continue
		[ -d "$file" ] || grep -xq "$name" "$data" && continue
		[ -f "$pacman_global/$name" ] ||
			[ -f "$pacman_local/$name" ] ||
			[ -f "$flatpak_global/$name" ] ||
			[ -f "$flatpak_local/$name" ] ||
			[ -f "$snap/$name" ] &&
			echo "$name" >> "$data"
	done
}

fixfiles() {
	lastmod=$(stat -c "%Y" "$data")
	tmp="$(mktemp)"
	trap 'rm $tmp' EXIT
	[ -f "$data" ] && cp "$data" "$tmp" && copied='true'
	lineno=0
	[ "$copied" = 'true' ] && while IFS= read -r name; do
		((lineno++))
		file="$user/$name"
		[ -f "$file" ] || { sed -i "${lineno}d" "$tmp" && ((lineno--)) ; continue; }
		[ -f "$pacman_global/$name" ] ||
			[ -f "$pacman_local/$name" ] ||
			[ -f "$flatpak_global/$name" ] ||
			[ -f "$flatpak_local/$name" ] ||
			[ -f "$snap/$name" ] ||
			mv "$file" "$bakdir/$name.bak"
	done < "$data"

	[ "$copied" = 'true' ] && [ "$(stat -c '%Y' "$data")" = "$lastmod" ] && sort -u "$tmp" > "$data"

	for bakfile in "$bakdir"/*.desktop.bak; do
		name=$(basename "${bakfile%.bak}") || continue
		origfile="$user/$name"
		[ -f "$origfile" ] && continue
		[ -f "$pacman_global/$name" ] ||
			[ -f "$pacman_local/$name" ] ||
			[ -f "$flatpak_global/$name" ] ||
			[ -f "$flatpak_local/$name" ] ||
			[ -f "$snap/$name" ] &&
			mv "$bakfile" "$origfile"
	done
}

for dir in "$user" "$pacman_global" "$pacman_local" "$flatpak_global" "$flatpak_local" "$snap"; do
	[ -d "$dir" ] && existing_dirs+=("$dir")
done

detectfiles
fixfiles

while read -r line; do
	if [ "$line" = "$user/" ]; then
		detectfiles
	else
		fixfiles
	fi
done < <(inotifywait -qm --format '%w' --include '\.desktop$' -e 'move,move_self,create,delete,delete_self,unmount' "${existing_dirs[@]}")