#!/bin/bash
# @Auther skiqqy
# This script is best run as root inside the root of this repo.
# This script allows me to enable/disable certain sections of my website.

# Available units
units=( git blog wiki irc proj files all )
RED='\033[0;31m'
NC='\033[0m'

# Show the help menu
help_menu () {
	echo "Welcome!"
	echo -e "e\t->\tEnable a unit."
	echo -e "d\t->\tDisable a unit."
	echo -e "u\t->\tSpecify the path to the units directory"
	echo -e "h\t->\tShows this message."
}

# Display an error message and exit.
# error [message] [exit code]
error () {
	printf "[${RED}ERROR${NC}] $1\n"
	exit $2
}

# links available site to enabled.
# link [unit]
link () {
	[ ! -f /etc/nginx/sites-available/$1 ] && error "The unit <$1> file cannot be linked." 1
	ln -s /etc/nginx/sites-available/$1 /etc/nginx/sites-enabled/$1
}

# Adds a unit so that nginx can use it, also sets up sym links.
# add [unit]
add () {
	echo Enabling $1
	cp $unitsd/$1 /etc/nginx/sites-available
	link $1
}

# Remove a unit so that nginx does not use it anymore, also sets up sym links.
# remove [unit]
remove () {
	echo Removing $1
	rm -f /etc/nginx/sites-enabled/$1
}

# Enable or disable all units.
# all [ e | d ]
all () {
	# Test and check valid args
	[ -z $1 ] && error "[ALL] Not given a flag." 1
	! [[ $1 == 'e' || $1 == 'd' ]] && error "[ALL] Not given a valid flag." 1

	REMOVE=()
	ADD=()
	for u in "${units[@]}"
	do
		if [ $u != "all" ]
		then
			if [ $1 == 'e' ]
			then
				ADD+=("$u")
				REMOVE+=("d$u")
			else
				REMOVE+=("$u")
				ADD+=("d$u")
			fi
		fi
	done

	echo "Adding units ( ${ADD[@]} )"
	echo "Removing units ( ${REMOVE[@]} )"

	for u in "${ADD[@]}"
	do
		add $u
	done

	for u in "${REMOVE[@]}"
	do
		remove $u
	done
}

# Handle arguments and do basic error checking
while getopts "he:d:u:" opt
do
	case $opt in
		h)
			help_menu
			exit 0
			;;
		e | d)
			[ ! -z $unit ] && error "Unit <$unit> already set." 1
			[[ $opt == "e" ]] && oper=e || oper=d
			unit="$OPTARG"
			;;
		u)
			[ -d "$OPTARG" ] && unitsd="$OPTARG" || error "Not <$OPTARG> a valid directory." 1
			;;
		*)
			exit 2
			;;
	esac
done

# if not specified, then by default we enable everything
[ -z $unit ] && unit="all" && oper="e"

# Unit directory
unitsd=${unitsd:="./units"}
unitsd=$(echo $unitsd | sed 's:/*$::') # Remove trailing slash

# Check that a valid unit was given.
[[ ! " ${units[@]} " =~ " ${unit} " ]] && error "The unit <$unit> does not exist." 1 \
	|| echo "Unit <$unit> is supported!"

# Check if we are disabeling, that we have a replacement unit
[ $oper == "d" ] && [ $unit != "all" ] && [[ ! -f "$unitsd/d$unit" ]] && error "Cannot find replacement unit for <$unit>." 1
[ $oper == "e" ] && [ $unit != "all" ] && [[ ! -f "$unitsd/$unit" ]] && error "Cannot find unit file for <$unit>" 1

# Everything is valid, Perform tasks
if [ $unit == "all" ]
then
	all $oper
elif [ $oper == 'e' ]
then
	add $unit
	remove "d$unit"
elif [ $oper == 'd' ]
then
	add "d$unit"
	remove $unit
	echo Disabling $unit
else
	error "No operation set." 1
fi

# Finally we test the new configs, and restart nginx
service nginx testconfig && systemctl restart nginx || error "nginx config test failed..." 1
