#!/bin/bash
# Toggle clamshell (closed-lid) mode on Linux laptops.
# Enables/disables a systemd service that prevents suspend when the lid is closed.
# Useful when using an external monitor, or when you need to close the lid
# without interrupting a background process (e.g. on the train).

SYSTEMCTL="/usr/bin/systemctl"
SUDO="/usr/bin/sudo"
TEE="/usr/bin/tee"
RM="/usr/bin/rm"
CAT="/usr/bin/cat"
SYSTEMD_DIR="/etc/systemd/system"
SH="/bin/sh"

TARGETS="sleep.target suspend.target hibernate.target hybrid-sleep.target"
SERVICE_NAME="clamshell-reset.service"
SERVICE="$SYSTEMD_DIR/$SERVICE_NAME"

SERVICE_CONTENT="[Unit]
Description=Undo clamshell mode on boot
[Service]
Type=oneshot
ExecStart=$SH -c '$SYSTEMCTL unmask $TARGETS && $SYSTEMCTL disable $SERVICE_NAME && $RM -f $SERVICE'
[Install]
WantedBy=multi-user.target"

GREEN='\033[38;5;114m'
ORANGE='\033[0;33m'
NC='\033[0m'

if ! $SUDO -v; then
    echo "This script requires sudo access." >&2
    exit 1
fi

if [ ! -x "$SYSTEMCTL" ]; then
    echo "This script requires systemctl (systemd)." >&2
    exit 1
fi

ENABLED=0
COUNT=0
for target in $TARGETS; do
    ((COUNT++))
    if $SYSTEMCTL is-enabled "$target" &>/dev/null; then
        ((ENABLED++))
    fi
done
if [ "$ENABLED" -gt 0 ] && [ "$ENABLED" -lt "$COUNT" ]; then
    echo "Targets are in an inconsistent state. This script would override your systemctl mask settings for: $TARGETS. To use this script, first run:" >&2
    echo "  $SYSTEMCTL is-enabled $TARGETS" >&2
    echo "  sudo $SYSTEMCTL unmask $TARGETS" >&2
    exit 1
fi

if $SYSTEMCTL is-enabled "${TARGETS%% *}" &>/dev/null; then
    $SUDO $SYSTEMCTL mask $TARGETS 2>/dev/null
    if [ ! -f "$SERVICE" ] || [ "$($CAT "$SERVICE")" != "$SERVICE_CONTENT" ]; then
        echo "$SERVICE_CONTENT" | $SUDO $TEE "$SERVICE" > /dev/null
        $SUDO $SYSTEMCTL daemon-reload
    fi
    $SUDO $SYSTEMCTL enable "$SERVICE_NAME" &>/dev/null
    echo -e "${ORANGE}Clamshell mode ON (sleep disabled, resets on reboot)${NC}"
else
    $SUDO $SYSTEMCTL unmask $TARGETS 2>/dev/null
    if [ -f "$SERVICE" ]; then
        $SUDO $SYSTEMCTL disable "$SERVICE_NAME" 2>/dev/null
        $SUDO $RM -f "$SERVICE"
    fi
    echo -e "${GREEN}Clamshell mode OFF (sleep enabled)${NC}"
fi
