#!/usr/bin/env bash
# Select an area, save it in Pictures/Screenshots, and copy it to the clipboard.
set -euo pipefail
umask 077

fail() {
    echo "ferese-screenshot: $*" >&2
    if command -v notify-send >/dev/null; then
        notify-send --app-name=Ferese --urgency=critical 'Screenshot failed' "$*" || true
    fi
    exit 1
}

for tool in slurp grim wl-copy flock; do
    command -v "$tool" >/dev/null || fail "Required command not found: $tool"
done
: "${XDG_RUNTIME_DIR:?A Wayland login session is required}"
exec 9>"$XDG_RUNTIME_DIR/ferese-screenshot.lock"
flock -n 9 || exit 0

# Escape cancels without creating a file or changing the clipboard.
geometry=$(slurp) || exit 0
[[ -n $geometry ]] || exit 0
pictures=$(xdg-user-dir PICTURES 2>/dev/null) || pictures="$HOME/Pictures"
directory=${pictures:-$HOME/Pictures}/Screenshots
mkdir -p -- "$directory" || fail 'Could not create the screenshot directory.'
file=$(mktemp "$directory/Screenshot-$(date +%Y-%m-%d_%H-%M-%S)-XXXXXX.png") || fail 'Could not create the screenshot file.'
trap 'rm -f -- "$file"' EXIT
grim -g "$geometry" "$file" || fail 'Could not capture the screen. Log back into Ferese after enabling screen capture.'
trap - EXIT
# Do not pass the selector lock to wl-copy's background clipboard process.
wl-copy --type image/png <"$file" 9>&- || fail "Saved to $file, but could not copy to the clipboard."
if command -v notify-send >/dev/null; then
    notify-send --app-name=Ferese 'Screenshot saved and copied' "$file" || true
fi
printf '%s\n' "$file"
