#! /bin/bash
#
# monitorset.sh
# Copyright (C) 2018 salt <salt@dsk-cstm-0>
#
# Distributed under terms of the MIT license.
#

if ! pgrep bspwm > /dev/null 2>&1; then
	tsk_log "Not running in bspwm"
	exit 1
fi

monitor_primary=$(xrandr -q | awk '/primary/{print $1}')
monitors_secondary=($(xrandr -q | grep ' connected' | grep -v 'primary' | awk '{print $1}'))

desktops_total=${BSPWM_DESKTOPS_TOTAL:-8}
desktops_primary=${BSPWM_DESKTOPS_PRIMARY:-6}
desktops_secondary=$(($desktops_total - $desktops_primary))

# Sanity checks
if ! [[ "$desktops_total" -ge 1 ]]; then
	tsk_log "desktops_total cannot be $desktops_total, defaulting to 8"
	desktops_total=8
fi
if ! [[ "$desktops_primary" -ge 1 ]]; then
	tsk_log "desktops_primary cannot be $desktops_primary, defaulting to 6"
	desktops_primary=6
fi

# Do we have enough desktops for all monitors?
# We can correct this without defaulting, so don't error
if [[ $desktops_secondary -lt ${#monitors_secondary[@]} ]]; then
	tsk_log "Configuration would leave some monitors without desktops; adding more"
	desktops_secondary=${#monitors_secondary[@]}
	desktops_total=$(($desktops_secondary + $desktops_primary))
	deskpermon=1
	tsk_log "Remaining desktops set to $desktops_secondary, highest desktop is now $desktops_total"
fi

# Can we actually reach all of these desktops via keybinds?
if [[ $desktops_total -gt 10 ]]; then
	tsk_log "More than ten desktops were allocated! Not all of these can be reached via keybinds!"
	if [[ $(($desktops_total - $desktops_secondary)) -gt 0 ]]; then
		tsk_log "Adjusting primary desktop reservation"
		desktops_primary=$(($desktops_total - $desktops_secondary))
		tsk_log "Set reserved desktops to $desktops_primary"
	else
		tsk_log "Cannot resolve this situation without starving the primary monitor of desktops!"
		tsk_log "This may result in desktops being allocated that cannot be easily accessed!"
	fi
fi


# The code that actually sets the monitors up
# First, do we actually have any secondaries?
if [[ $(echo ${monitors_secondary:-0}) == "0" ]]; then
	# We only have one monitor, so give it everything
	layout=$(seq --separator=" " 1 $desktops_total)
	tsk_log "Found one monitor: $monitor_primary, so giving it layout \"$layout\""
	bspc monitor $monitor_primary -d $layout
else
	deskpermon=$(($desktops_secondary / ${#monitors_secondary[@]}))
	layout=$(seq --separator=" " 1 $desktops_primary)
	tsk_log "Giving primary monitor $monitor_primary layout \"$layout\""
	bspc monitor $monitor_primary -d $layout
	unset layout
	tsk_log "Attempting to put $desktops_secondary desktops across ${#monitors_secondary[@]} monitors, $deskpermon each"
	for m in $(seq 0 $((${#monitors_secondary[@]} - 1))); do
		layout=$(seq --separator=" " $((1 + $m + $desktops_primary)) ${#monitors_secondary[@]} "$desktops_total")
		tsk_log "Giving monitor $m (${monitors_secondary[$m]}) layout \"$layout\""
		bspc monitor ${monitors_secondary[$m]} -d $layout
	done
fi
unset monitor_primary
unset monitors_secondary
unset desktops_total
unset desktops_primary
unset desktops_secondary