#!/bin/bash

##########################################################
#   Configuration
##########################################################
#
# Here you can set the default installation directory
# 
DEFAULT_TARGET="/usr/share/gitweb"




##########################################################
#   Functions
##########################################################
#
# (no need to modify, unless you want to)
#
install()
{
	set_target
	set_cmd_args
	
	if [[ $(check_for_symlinks) == $TRUE && $(check_for_backups) == $TRUE ]]
	then
		log ""
		log "[ERROR]  - Symlinks and backups found in target, nothing to do."
		log "[ERROR]  - (Is the theme already installed?)"
		exit 1
	else

#Backing up
		if [[ $INTERACTIVE == $TRUE ]]
		then
			log ""
			if [[ $(confirm "Backing up original files, continue?") == $FALSE ]]
			then
				echo ""
				exit 1
			else
				echo ""
			fi
		fi

		if [[ $(check_for_backups) == $TRUE ]]
		then
			log "[NOTICE] - Backups present, skipping..."
		else
			log ""
			log "Backing up..."
			log ""
			for FILE in "${THEME_FILES[@]}"
			do
				if [[ -e "$TARGET/$FILE.bak" ]]
				then
					log "Skipping $FILE.bak, file exists..."
				else
					mv $MV_ARGS "$TARGET/$FILE" "$TARGET/$FILE.bak"
				fi
			done
			log ""
			log "...done"
		fi

#Symlinking
		if [[ $INTERACTIVE == $TRUE ]]
		then
			log ""
			if [[ $(confirm "Linking theme files, continue?") == $FALSE ]]
			then
				echo ""
				exit 1
			else
				echo ""
			fi
		fi

		if [[ $(check_for_symlinks) == $TRUE ]]
		then
			log "[NOTICE] - Symlinks present, skipping..."
		else
			log ""
			log "Linking..."
			log ""
			for FILE in "${THEME_FILES[@]}"
			do
				if [[ -h "$TARGET/$FILE" ]]
				then
					log "Skipping $FILE, symlink exists..."
				else
					ln $LN_ARGS "$THEME/$FILE" "$TARGET/$FILE"
				fi
			done
			log ""
			log "...done"
		fi
	fi
	
	log ""
	log "[NOTICE] - Installation complete!"
}

remove()
{
	set_target
	set_cmd_args
	
	if [[ $(check_for_symlinks "missing") == $TRUE && $(check_for_backups "missing") == $TRUE ]]
	then
		log ""
		log "[ERROR]  - No symlinks or backups found in target, Nothing to do."
		log "[ERROR]  - (Is the theme already removed?)"
		exit 1
	else
	
#Deleting
		if [[ $INTERACTIVE == $TRUE ]]
		then
			log ""
			if [[ $(confirm "Deleting symlinks, continue?") == $FALSE ]]
			then
				echo ""
				exit 1
			else
				echo ""
			fi
		fi

		if [[ $(check_for_symlinks) == $TRUE ]]
		then
			log ""
			log "Deleting symlinks..."
			log ""
			for FILE in "${THEME_FILES[@]}"
			do
				if [[ -h "$TARGET/$FILE" ]]
				then
					rm $RM_ARGS "$TARGET/$FILE"
				else
					log "Skipping $FILE, not found..."
				fi
			done
			log ""
			log "...done"
		else
			log "[NOTICE] - Symlinks not found, skipping..."
		fi
		
#Restoring
		if [[ $INTERACTIVE == $TRUE ]]
		then
			log ""
			if [[ $(confirm "Restoring original files, continue?") == $FALSE ]]
			then
				echo ""
				exit 1
			else
				echo ""
			fi
		fi
		
		if [[ $(check_for_backups) == $TRUE ]]
		then
			log ""
			log "Restoring..."
			log ""
			for FILE in "${THEME_FILES[@]}"
			do
				if [[ -e "$TARGET/$FILE.bak" ]]
				then
					mv $MV_ARGS "$TARGET/$FILE.bak" "$TARGET/$FILE"
				else
					log "Skipping $FILE.bak, not found..."
				fi
			done
			log ""
			log "...done"
		else
			log "[NOTICE] - Backups not found, skipping..."
		fi
	fi
	
	log ""
	log "[NOTICE] - Removal complete!"
}

set_target()
{
	if [[ $TARGET && $(check_for_static $TARGET) == $TRUE ]]
	then
		log "[NOTICE] - Using specified target path: '$TARGET'"
		
		if [[ $INTERACTIVE == $TRUE ]]; then
			if [[ $(confirm "Is this correct?") == $FALSE ]]; then
				echo ""
				exit 1
			else
				echo ""
			fi
		fi

		TARGET="$TARGET/static"
	else
		if [[ $(check_for_static $DEFAULT_TARGET) == $TRUE ]]
		then
			log "[NOTICE] - Target not set, using default path: '$DEFAULT_TARGET'"
			
			if [[ $INTERACTIVE  == $TRUE ]]
			then
				log ""
				if [[ $(confirm "Is this ok?") == $FALSE ]]
				then
					echo ""
					exit 1
				else
					echo ""
				fi
			fi

			TARGET="$DEFAULT_TARGET/static"
		else
			log ""
			log "[ERROR]  - Couldn't find folder 'static/' in the target path: '$TARGET'"
			log "[ERROR]  - (Are you sure this folder contains gitweb?)"
			exit 1
		fi
	fi
}

set_cmd_args()
{
	MV_ARGS=""
	LN_ARGS=""
	RM_ARGS=""

	if [[ $VERBOSE == $TRUE ]];
	then
		MV_ARGS="-v"
		LN_ARGS="-v -s"
		RM_ARGS="-v"
	fi
	
	if [[ $INTERACTIVE == $TRUE ]];
	then
		MV_ARGS="-i"
		LN_ARGS="-i -s"
		RM_ARGS="-i"
	fi
	
	if [[ $INTERACTIVE == $TRUE && $VERBOSE == $TRUE ]];
	then
		MV_ARGS="-i -v"
		LN_ARGS="-i -v -s"
		RM_ARGS="-i -v"
	fi
}

check_for_static()
{
	local RETURN=$FALSE
	
	if [[ -d "$1/static" ]]
	then
		RETURN=$TRUE
	fi
	
	echo $RETURN
}

#If all present, true
#If passed "missing", and all missing, true
check_for_symlinks()
{
	local RETURN=$TRUE

	if [[ $1 == "missing" ]]
	then
		local COUNT=0
	
		for FILE in "${THEME_FILES[@]}"
		do
			if [[ ! -h "$TARGET/$FILE" ]]
			then
				COUNT=$(expr $COUNT + 1)
			fi
		done
		
		if [[ $COUNT == "${THEME_FILES[@]}" ]]
		then
			RETURN=$TRUE
		else
			RETURN=$FALSE
		fi
	else
		for FILE in "${THEME_FILES[@]}"
		do
			if [[ ! -h "$TARGET/$FILE" ]]
			then
				RETURN=$FALSE
			fi
		done
	fi
	
	echo $RETURN
}

#If all present, true
#If passed "missing", and all missing, true
check_for_backups()
{
	local RETURN=$TRUE
	
	if [[ $1 == "missing" ]]
	then
		local COUNT=0
	
		for FILE in "${THEME_FILES[@]}"
		do
			if [[ ! -e "$TARGET/$FILE.bak" ]]
			then
				COUNT=$(expr $COUNT + 1)
			fi
		done
		
		if [[ $COUNT == "${THEME_FILES[@]}" ]]
		then
			RETURN=$TRUE
		else
			RETURN=$FALSE
		fi
	else
		for FILE in "${THEME_FILES[@]}"
		do
			if [[ ! -e "$TARGET/$FILE.bak" ]]
			then
				RETURN=$FALSE
			fi
		done
	fi

	echo $RETURN
}

confirm()
{
	read -n 1 -p "$0: $1 [y] | [n] : " REPLY
	
	case $REPLY in
		y|Y)
			echo $TRUE
		;;
		n|N)
			echo $FALSE
		;;
		*)
			echo "$0: [ERROR] - You must answer [y] | [n]"
			confirm "$1"
		;;
	esac
}

log()
{
	if [[ $VERBOSE == $TRUE ]]
	then
		echo "$0: $1"
	fi
}

usage()
{
cat << EOF
Usage: $0 [-v|-i] [-t <TARGET>|--target <TARGET>] [--install|--remove|--repair]
Or: $0 [-V|-h|--version|--help] 

This script will create symlinks to your gitweb install for themeing.
The default location is '/usr/share/gitweb' unless set via -t or --target. 

OPTIONS:
  -v, --verbose       Verbose output
  -i, --interactive   Pauses for confirmation at each step
  -t, --target        Where to create the symlinks, gitweb installation path
  -h, --help          Shows this usage message
  -V, --version       Displays version information
  --install           Adds '.bak' to original files and creates symlinks to theme files
  --remove            Deletes themed symlinks and restores the original files.
  --repair            Removes all theme files, then reinstalls
EOF
}



##########################################################
#   Let's Go!
##########################################################
#
PROG_NAME=$0
PROG_VERSION="0.9.0"
AUTHOR="Kevin Hill <http://github.com/kevinkhill>"

readonly TRUE=0
readonly FALSE=1

TARGET=
THEME=$(pwd)
INTERACTIVE=$FALSE
VERBOSE=$FALSE

THEME_FILES=( "gitweb.css" "gitweb.js" "git-favicon.png" "git-logo.png" )

SHORT_OPTS="Vhvit:"
LONG_OPTS="version,help,verbose,interactive,target:,install,remove,repair"
OPTS=$(getopt -o "$SHORT_OPTS" -l "$LONG_OPTS" --name "$0" -- "$@")

if [ $? != 0 ]; then
    exit 1
fi

eval set -- "$OPTS"
unset OPTS

if [ $# -eq 0 ]; then
	echo "$0: [ERROR] - no options specified" >&2
	usage
fi

while [ $# -gt 0 ]; do
	case $1 in
		-h|--help|-\?)
			usage
			exit 0
		;;
		-v|--verbose)
			VERBOSE=$TRUE
		;;
		-i|--interactive)
			INTERACTIVE=$TRUE
		;;
		-t|--target)
			TARGET=$2
			shift
		;;
		-V|--version)
			echo "Gitweb Theme Installer Script - v$PROG_VERSION"
			echo " Author: $AUTHOR"
		;; 
		--install)
			install
		;;
		--remove)
			remove
		;;
		--repair)
			remove
			install
		;;
		--)
			shift
			break
		;;
		-*)
			echo "$0: [ERROR] - unrecognized option $1" >&2
			shift
		;;
		*)
			break
		;;
	esac
	shift
done

exit 0
