#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

if [[ ! ":$PATH:" == *":/usr/local/bin:"* ]]
then
	export PATH="/usr/local/bin:$PATH"
fi

# if started as root
if [ $UID -eq 0 ]
then
	chown executor:executor /data
	su executor -c $0
	exit $?
fi

dir_prefix=cloner

function die(){
	echo $@ 1>&2
	exit 1
}

function checkProjectName(){
	# check, if volume does not exist yet
	name=$1
	# should not be empty
	[ -n "$read_project_name" ] || die "Empty project name is not allowed"
	if [ -d /data/$dir_prefix-$name ] 
	then
		die "Target volume for project '$name' exists - please try again!"
	fi
}


function createConfigFile(){
	# creates config file, writes it to $1 location
	loc=$1

	# vars
	local tmpl_name=$read_project_name
	local tmpl_url=$read_url
	local tmpl_interval=$read_interval
	local tmpl_submodules=$read_submodules
	
	if [ $read_submodule_limit = "N" ]
	then
		local tmpl_submodules_depth_enabled='# '
		local tmpl_submodules_depth=50000
	else 
		local tmpl_submodules_depth_enabled=''
		local tmpl_submodules_depth=$read_submodule_limit
	fi

	cat > $loc <<-EOF
	# cloner.cfg
	# main config
	# created at $(date +"%Y-%m-%d %X")

	# main url - url of main repo - just to clone
	cloner_repo_url=$tmpl_url

	# project name (names of volumes are derrived from this 
	cloner_project_name=$tmpl_name

	# cloner interval (in minutes, default=0 - run always)
	cloner_interval=$tmpl_interval

	# do you need submodules support? (1/0)
	cloner_submodules=$tmpl_submodules

	# max depth of submodule scan (default = unlimited, uncomment to use)
	${tmpl_submodules_depth_enabled}cloner_submodule_depth=$tmpl_submodules_depth

	EOF
}

function createDetectorConfig(){
	# $1 - file
	local cfgFile=$1

	mkdir -p $(dirname $cfgFile)

	if [ $read_detector -eq 1 ] 
	then
		cat > $cfgFile <<-EOF
		# this file is config for detector
		# now, it is empty - to disable detector, just delete it!
		EOF
	fi
}

function generateSSHKey(){
	# generates ssh key with $1 path and $2 description
	local keyfile=$1/identity
	local description=$2
	echo "Creating SSH deployment key.."
	ssh-keygen -f $keyfile -t ed25519 -C "$description" -N ""
	echo 
	echo "Public key is:"
	echo "-----------------------------------------------------"
	cat $keyfile.pub
	echo "-----------------------------------------------------"
	echo -n "Please make sure that key is set up at your git hosting and press enter.."
	read
}


function reuseSSHKey(){
	# pastes ssh key to file $1 with vim
	local keyfile=$1
	local scratch=$(mktemp)
	echo "# Please paste private ssh key here and save this file" > $scratch
	vim $scratch
	sed -e 's/#.*$//' $scratch > $keyfile
	rm $scratch
	echo "Checking key..."
	chmod 0700 $keyfile
	ssh-keygen -y -f $keyfile -P ""	|| true # will fail in the end, so script will continue and clean up the mess
}

# start reading vars
echo -n "Enter project name: "
read read_project_name
checkProjectName "$read_project_name"


# repository URL
echo -n "Enter git repository URL: "
read read_url
[ -n "$read_url" ] || die "Empty url is not allowed!" 

# check interval
echo -n "Enter check interval in minutes [5]: "
read read_interval
[ -n "$read_interval" ] || read_interval=5
[[ "$read_interval" =~ ^[0-9]+$ ]] || echo "Entered interval is not number. Try again.."

# submodule use
echo -n "Mirror including submodules? [Y/n]" 
read read_submodules
[ -n "$read_submodules" ] || read_submodules=Y
[[ "$read_submodules" =~ ^[Yy]$ ]] && read_submodules=1 || read_submodules=0

# submodule limit
if [ $read_submodules -eq 1 ] 
then
	echo -n "Limit for submodule discovery [<number>/N]: "
	read read_submodule_limit
	[ -n "$read_submodule_limit" ] || read_submodule_limit=N
	if ! [[  "$read_submodule_limit" =~ ^[Nn]$ ]] 
	then
		[[ "$read_submodule_limit" =~ ^[0-9]+$ ]] || die "Submodule limit must be n,N or number!"
	fi
else
	read_submodule_limit=N
fi


# determine CI?
echo -n "Do you want to enable CI support? (detector) [Y/n]"
read read_detector
[ -n "$read_detector" ] || read_detector=Y
if ! [[ "$read_detector" =~ ^[Yy]$ ]] 
then
	read_detector=0
else
	read_detector=1
fi


root=/data/$dir_prefix-$read_project_name
# start generating config
mkdir -p $root/config
createConfigFile $root/config/cloner.cfg

# use ssh config?
echo -n "Would you like to use SSH auth? ([C]reate new key/[U]se existing key/[N]o) [C/u/n]: "
read read_ssh
[ -n "$read_ssh" ] || read_ssh=C
[[ "$read_ssh" =~ ^[CcUuNn]$ ]] || die "Invalid SSH key option, script is exiting now.."

# ssh resolutions? 
# create dir if needed
[[ "$read_ssh" =~ ^[nN]$ ]] || mkdir -p $root/config/auth/ssh

# generate new key
if [[ "$read_ssh" =~ ^[Cc]$ ]] 
then
	# create key
	generateSSHKey $root/config/auth/ssh "cloner-deploy-key-$read_project_name"
fi

# use existing key
if [[ "$read_ssh" =~ ^[Uu]$ ]] 
then
	# load key
	reuseSSHKey $root/config/auth/ssh/identity
fi


echo "First run - initialization of repos..."
if ! env BASE=$root run-checker
then 
	echo -n "First run failed - remove directory? [Y/n]"
	read read_cleanup
	[ -n "$read_cleanup" ] || read_cleanup=Y
	if [[ "$read_cleanup" =~ ^[Yy]$ ]] 
	then		
		rm -Rf $root
	fi
else
	createDetectorConfig $root/config/detector.cfg
	echo "Setup has finished!"
	touch $root/.enabled
fi