#!/usr/bin/env bash
#
# swayshot - Unified Screenshot helper for Sway
#
# Copyright (C) 2025 Johannes Kamprad
#
# SPDX-License-Identifier: GPL-3.0-or-later

# needed packages: `sudo pacman -Syu --needed grim slurp swappy xdg-user-dirs wl-clipboard`
# this tool let you select rectangle area of your screen (-s),
# opens it in swappy to edit, and save it under users screenshot path.
# Or take a screenshot of all displays usding -a (all), and automatically saving it in user screenshot path

set -e

usage() {
    echo "Usage: $0 [OPTION]"
    echo "  -a, --all      Screenshot all screens"
    echo "  -s, --select   Select a region and edit with swappy"
    echo "  -d, --delay X  Delay X seconds before taking the screenshot"
    exit 1
}

# Default values
DELAY=0

# Parse arguments
if [[ $# -lt 1 ]]; then
    usage
fi

while [[ $# -gt 0 ]]; do
    case "$1" in
        -a|--all)
            MODE="all"
            shift
            ;;
        -s|--select)
            MODE="select"
            shift
            ;;
        -d|--delay)
            DELAY="$2"
            shift 2
            ;;
        *)
            usage
            ;;
    esac
done

if [ -z "$MODE" ]; then
    usage
fi

# Try to get the XDG Pictures directory using xdg-user-dirs
PICTURES_DIR=$(xdg-user-dir PICTURES 2>/dev/null)
if [ -z "$PICTURES_DIR" ]; then
    PICTURES_DIR="$HOME/Pictures"
fi

SCREENSHOT_DIR="$PICTURES_DIR/screenshots"
mkdir -p "$SCREENSHOT_DIR"
DATE=$(date '+%Y-%m-%d_%H-%M-%S')
FILENAME="screenshot_$DATE.png"
FILEPATH="$SCREENSHOT_DIR/$FILENAME"

if [ "$MODE" = "all" ]; then
    # If delay set, sleep BEFORE taking the screenshot for "all" mode
    if [ "$DELAY" != "0" ]; then
        sleep "$DELAY"
    fi

    # Screenshot all screens
    grim "$FILEPATH"
    notify-send "Screenshot created" "here: $FILEPATH" -i "$FILEPATH"
    echo "Saved: $FILEPATH"

elif [ "$MODE" = "select" ]; then
    # For select: let user immediately select area, then (optionally) wait DELAY seconds BEFORE capture
    TMPFILE="/tmp/swappy_$$.png"
    # get geometry from slurp first (user selects now)
    GEOM="$(slurp)"

    # now wait if requested so the capture happens after the delay
    if [ "$DELAY" != "0" ]; then
        sleep "$DELAY"
    fi

    # capture the previously selected geometry
    grim -g "$GEOM" "$TMPFILE"
    swappy -f "$TMPFILE"

    # Find latest swappy file (usually saved as $HOME/swappy-*.png)
    LATEST=$(ls -t "$HOME"/swappy-*.png 2>/dev/null | head -n1)
    if [ -f "$LATEST" ]; then
        mv "$LATEST" "$FILEPATH"
        wl-copy < "$FILEPATH"
        notify-send "Screenshot saved and copied to clipboard" "$FILEPATH" -i "$FILEPATH"
        echo "Saved & copied: $FILEPATH"
    else
        notify-send -i dialog-warning "Screenshot canceled..."
        echo "No screenshot saved."
    fi
    rm -f "$TMPFILE"
fi
