#!/bin/sh
set -euo pipefail
exec 0<&-

wpa_running=
hciattach_running=
bluetoothd_running=

asound_state_dir=/tmp/asound-suspend

before() {
	>&2 echo "Preparing for suspend..."

	>&2 echo "Saving mixer state..."
	mkdir -p "$asound_state_dir"
	alsactl --file "$asound_state_dir/asound.state.pre" store || true

	if pgrep wpa_supplicant; then
		wpa_running=1
		>&2 echo "Stopping wpa_supplicant..."
		killall -9 wpa_supplicant || true
	fi
	ifconfig wlan0 down || true

	if pgrep hciattach; then
		hciattach_running=1
		>&2 echo "Stopping hciattach..."
		/etc/init.d/hciattach stop || true
	fi
	if pgrep bluetoothd; then
		bluetoothd_running=1
		>&2 echo "Stopping bluetoothd..."
		/etc/bluetooth/bluetoothd stop || true
		killall -15 bluealsa || true
	fi

	>&2 echo "Blocking wireless..."
	echo 0 >/sys/class/rfkill/rfkill0/state || true
}

after() {
	>&2 echo "Resumed from suspend."

	>&2 echo "Restoring mixer state..."
	alsactl --file "$asound_state_dir/asound.state.post" store || true
	alsactl --file "$asound_state_dir/asound.state.pre" restore || true

	>&2 echo "Unblocking wireless..."
	echo 1 >/sys/class/rfkill/rfkill0/state || true

	if [ -n "$wpa_running" ]; then
		>&2 echo "Starting wpa_supplicant..."
		wpa_supplicant -B -D nl80211 -iwlan0 -c /etc/wifi/wpa_supplicant.conf -O /etc/wifi/sockets || true
		(( udhcpc -i wlan0 &)&)
	fi

	if [ -n "$hciattach_running" ]; then
		>&2 echo "Starting hciattach..."
		/etc/init.d/hciattach start || true
	fi
	if [ -n "$bluetoothd_running" ]; then
		>&2 echo "Starting bluetoothd..."
		/etc/bluetooth/bluetoothd start || true
		/usr/bin/bluetoothctl power on || true
	fi
}

before

>&2 echo "Suspending..."
echo mem >/sys/power/state

# Resume services in background to reduce UI latency
(( after &)&)
