#!/usr/bin/env bash

#
# sway-powermenu-gracefully - a very simple rofi powermenu
# powermenu but closing every app before doing logout or reboot
# Copyright (C) 2025 Johannes Kamprad
#
# SPDX-License-Identifier: GPL-3.0-or-later

# needs rofi config:
# $HOME/.config/rofi/powermenu.rasi
# or systemwide: /usr/share/sway_tools/rofi/powermenu.rasi

# default layout
DEFAULT_THEME="/usr/share/sway_tools/rofi/powermenu.rasi"

# Custom path (in case the user wants to overwrite the layout)
USER_THEME="${XDG_CONFIG_HOME:-$HOME/.config}/rofi/powermenu.rasi"

# Check if custom layout exists in the user path and use it in case
if [ -f "$USER_THEME" ]; then
    ROFI_THEME="$USER_THEME"
else
    ROFI_THEME="$DEFAULT_THEME"
fi

# Define possible lock scripts/commands (edit this list as you like)
LOCK_SCRIPTS=("swaylock" "swaylock-effects" "i3lock" "$HOME/.config/sway/scripts/gtklock")

# Find available lock script
find_lock_script() {
    for script in "${LOCK_SCRIPTS[@]}"; do
        # Handle command names vs full paths
        if [[ "$script" =~ ^[a-zA-Z0-9_-]+$ ]]; then
            # It's a command name, check if available
            if command -v "$script" >/dev/null 2>&1; then
                echo "$script"
                return 0
            fi
        else
            # It's a path, check if file exists and is executable
            if [[ -x "$script" ]]; then
                echo "$script"
                return 0
            fi
        fi
    done
    return 1
}

# Menu entries
chancel="  Cancel"
lock="   Lock"
logout="󰗽   Logout"
reboot="󱎝    Reboot"
shutdown="󰐥   Shutdown"
suspend=" Suspend"
hibernate="  Hibernate"


# Add lock only if script is found
if lockcmd="$(find_lock_script)"; then
    options="$chancel\n$lock\n$logout\n$reboot\n$shutdown\n$suspend\n$hibernate"
else
    options="$chancel\n$logout\n$reboot\n$shutdown\n$suspend\n$hibernate"
fi

chosen="$(echo -e "$options" | rofi -dmenu -i -p "Power Menu" \
    -theme $ROFI_THEME)"

case $chosen in
    "$lock")
        $lockcmd
        ;;
    "$cancel"|"")
        exit 0
        ;;
    "$logout")
        sway-gracefully-exit exit
        ;;
    "$reboot")
        sway-gracefully-exit reboot
        ;;
    "$shutdown")
        sway-gracefully-exit poweroff
        ;;
    "$suspend")
        systemctl suspend
        ;;
    "$hibernate")
        systemctl hibernate
        ;;
esac
