#!/bin/bash

##############################################################
# Static variables
##############################################################
SANDBOX_DIR=".cabal-sandbox"
ADDED_SOURCES="$SANDBOX_DIR/add-source-timestamps"
CABALCFG="cabal.sandbox.config"

##############################################################
# Check if sandbox config exists
##############################################################
if [ ! -f $CABALCFG ]; then
	echo "No $CABALCFG found in $(basename "$PWD")!"
	exit 1
fi

##############################################################
# Calculate paths for paths update
##############################################################
PDB=$(awk '/^package-db: /{ print $NF }' $CABALCFG)
PACKAGE_DIR=$(basename $PDB)
PACKAGES="$SANDBOX_DIR/$PACKAGE_DIR/*.conf"

ORIG_PATH=$(echo $PDB | rev | cut -d"/" -f3- | rev)
BASE_ORIG_PATH=$(echo $PDB | rev | cut -d"/" -f4- | rev)
NEW_PATH=$(pwd)
BASE_NEW_PATH=$(dirname $PWD)

##############################################################
# Get the mode from user
##############################################################
function askMode() {
	echo "Packages:"
	echo " From: $ORIG_PATH"
	echo " To  : $NEW_PATH"
	echo "Added sources:"
	echo " From: $BASE_ORIG_PATH"
	echo " To  : $BASE_NEW_PATH"
	echo "What to change?"
	echo "(N)othing | (P)ackages only | added (S)ources and packages"
}

##############################################################
# Update paths
##############################################################
function doChange() {
	# Update packages
	sed -i "s|$ORIG_PATH|$NEW_PATH|g" $CABALCFG
	sed -i "s|$ORIG_PATH|$NEW_PATH|g" $PACKAGES
	cabal sandbox hc-pkg -- recache --user
	rm -rf $SANDBOX_DIR/packages
	cabal sandbox init
	cabal configure
	rm -rf .dist-buildwrapper

	if [ "$1" = "s" ]; then
		# Update added sources
		sed -i "s|$BASE_ORIG_PATH|$BASE_NEW_PATH|g" $ADDED_SOURCES
	fi
}

##############################################################
# Start the script
##############################################################
echo "***Updating sandbox paths in $(basename "$PWD")"

##############################################################
# Accept MODE as first argument, if exists
##############################################################
if [ $1. = . ]; then
	askMode; read MODE
else
	MODE=$1
fi

##############################################################
# Perform process according to user selected MODE
##############################################################
case $MODE in
	p | P ) doChange;;
	s | S ) doChange $MODE;;
	*     ) echo "No update performed!";;
esac
