#!/bin/sh
# 2017, 2018, 2019, 2020 (c) Etersoft https://etersoft.ru
# Author: Vitaly Lipatov <lav@etersoft.ru>
# Public domain

# load common functions, compatible with local and installed script
. `dirname $0`/../share/eterbuild/functions/common
load_mod git

set_girar_host $1 && shift

if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
	echo "gitask — ssh gear.alt task wrapper"
	echo "Use: gitask [GIRAR] [new|run|commit|add|deps|copy|find|log|show|ls]"
	echo "$HELP_GIRAR"
	echo "     --help - help"
	docmd ssh $GEARHOST task help | sed -e "s|abort|cancel|g"
	echo
	echo "Examples:"
	echo "     ls                          - list tasks"
	echo "     new    [p8]                 - create new task [on p8 branch, Sisyphus by default]"
	echo "     run    [-m <message>] [NNNN]               - run task NNNN"
	echo "     commit [-m <message>] [NNNN] [NNNN2]       - commit task(s) NNNN, [NNNN2]"
	echo "     add del package [package2]  - add package remove command"
	echo "     add rebuild package [package2]  - add package rebuild"
	echo "     add --help                  - show task add help"
	echo "     task --help                 - show task help"
	echo "     share  NNNN [enable]        - share task NNNN"
	echo "     deps   NNNN add XXXX        - add deps from XXXX to task NNNN"
	echo "     copy   NNNN to (p8|p9) [from XX]  - copy package from Sisyphus to (p8|p9) [from XX]"
	echo "     find   PACKAGE              - do find-package of PACKAGE"
	echo "     log    NNNN                 - show build log for task NNNN"
	echo "     show   NNNN                 - show subtask list for task NNNN"
	echo "     quota                       - show quota on the build server"
	echo "     cancel NNNN                 - cancel task NNNN"
	echo "     rebuild --help              - rebuild package"
	exit 0
fi

get_last()
{
	ssh $GEARHOST task ls | head -n1 | sed -e "s|^#\([0-9]*\) .*|\1|g"
}

get_test_status()
{
	ssh $GEARHOST task ls | grep "^#$1 " | grep "\[test-only\]"
}

# get subtask number from TASKNUMBER for PROJECTNAME
get_subtask()
{
	ssh $GEARHOST task show $1 | grep "/$2.git" | sed -e "s|^ \([0-9]*\):.*|\1|g"
}

# TODO: acl

$EPMCMD assure girar-show girar-utils

if [ "$1" = "get" ] ; then
	if [ "$1 $2" = "get subtask" ] ; then
		[ -n "$3" ] || fatal "get subtask TASK PROJECTNAME"
		[ -n "$4" ] || fatal "get subtask $3 PROJECTNAME"
		get_subtask "$3" "$4"
		exit
	elif [ "$1 $2 $3" = "get last " ] || [ "$1 $2 $3" = "get last task" ] ; then
		get_last
		exit
	else
		fatal "Unknown command $1 $2"
	fi
fi

if [ "$1" = "find" ] ; then
	shift
	#showcmd "$GEARHOST>" find-packages "$@"
	docmd ssh $GITHOST find-package "$@"
	exit
fi

if [ "$1" = "rebuild" ] ; then
	shift
	showcmd "$GEARHOST>" build rebuild "$@"
	docmd ssh $GEARHOST build rebuild "$@"
	exit
fi

if [ "$1" = "log" ] ; then
	shift
	TASK="$1"
	[ -n "$TASK" ] || TASK="$(get_last)" || fatal
	showcmd "$GEARHOST>" girar-show "$TASK"
	GIT_ALT=$GEARHOST girar-show "$TASK"
	exit
fi

if [ "$1" = "ls" ] ; then
	shift
	if [ "$1" = "--all" ] ; then
		ssh $GEARHOST task ls "$@"
		exit
	fi
	# TODO: with arg(s) — subtask
	# TODO: add support ls -a (with subtasks)
	showcmd "$GEARHOST>" girar-show "$@"
	GIT_ALT=$GEARHOST girar-show "$@"
	exit
fi

if [ "$1" = "quota" ] ; then
	docmd ssh $GEARHOST quota
	exit
fi

if [ "$1" = "copy" ] ; then
	shift
	PACKAGELIST=''
	while [ -n "$1" ] ; do
		[ "$1" = "to" ] && break
		PACKAGELIST="$PACKAGELIST $1"
		shift
	done

	[ "$1" = "to" ] || fatal "missed 'to' in your command"
	shift # to
	TARGET="$1"
	shift

	FROMSTR=''
	[ "$1" = "from" ] && FROMSTR="$2"

	[ -n "$PACKAGELIST" ] || fatal "no packages"
	showcmd ssh $GEARHOST task new $TARGET
	TASK="$(ssh $GEARHOST task new $TARGET | head -n1)" || fatal
	for PACKAGE in $PACKAGELIST ; do
		docmd ssh $GEARHOST task add $TASK copy $PACKAGE $FROMSTR
	done
	docmd ssh $GEARHOST task run $TASK
	exit
fi

if [ "$1" = "add" ] ; then
	SUBTASK=''
	ADDCMD=''
	ADDCMDLIST="del copy repo rebuild"
	# add TASKNUMBER package
	if isnumber "$2" && estrlist has "$3" $ADDCMDLIST ; then
		TASK="$2"
		ADDCMD="$3"
		shift 3
	elif isnumber "$2" && isnumber "$3" && estrlist has "$4" $ADDCMDLIST ; then
		TASK="$2"
		SUBTASK="$3"
		ADDCMD="$4"
		shift 4
	elif estrlist has "$2" $ADDCMDLIST ; then
		TASK="$(get_last)"
		ADDCMD="$2"
		shift 2
	else
		fatal "don't support $1 $2 command"
	fi

	[ -n "$1" ] || fatal "no packages"

	while [ -n "$1" ] ; do
		PACKAGE="$1"
		[ "$ADDCMD" = "repo" ] && PACKAGE="$1 $2" && shift
		shift
		ST="$(get_subtask $TASK $PACKAGE)"
		if [ -n "$ST" ] ; then
			info "$PACKAGE already present in the task $TASK as subtask $ST, replacing ..."
			docmd ssh $GEARHOST task delsub $TASK $ST
			[ -n "$SUBTASK" ] || SUBTASK="$ST"
		fi
		docmd ssh $GEARHOST task add $TASK $SUBTASK $ADDCMD $PACKAGE
	done
	exit
fi

if [ "$1" = "show" ] ; then
	shift
	COMMIT=''
	TASKLIST="$1"
	if [ -z "$TASKLIST" ] ; then
		TASKLIST="$(get_last)" || fatal "Can't get last task"
	fi
	docmd ssh $GEARHOST task show "$TASKLIST"
	exit
fi

if [ "$1" = "run" ] || [ "$1" = "commit" ] ; then
	COMMIT=''
        [ "$1" = "commit" ] && COMMIT="--commit"
	shift

	TASKLIST=''
	MESSAGE=''

	while [ -n "$1" ] ; do
		# TODO: check for number?
		if echo "$1" | grep -qv "^-" ; then
			TASKLIST="$TASKLIST $1"
		elif [ "$1" = "-m" ] ; then
			MESSAGE="$1 ${2// /_}"
			shift
		else
			fatal "Unknown param $1"
		fi
		shift
	done

	[ -n "$TASKLIST" ] || TASKLIST="$(get_last)" || fatal "Can't get last task"

	for TASK in $TASKLIST ; do
		docmd ssh $GEARHOST task run $MESSAGE $COMMIT "$TASK"
	done
	exit
fi

if [ "$1" = "cancel" ] ; then
	shift
	#TASK="$(get_last)" || fatal
	if [ "$GEARHOST" = "git.eter" ]  || [ "$GEARHOST" = "git.office" ] ; then
		docmd ssh $GEARHOST task cancel "$@"
	else
		docmd ssh $GEARHOST task abort "$@"
	fi
	exit
fi

if [ "$1" = "share" ] && [ -n "$2" ] ; then
	#shift
	docmd ssh $GEARHOST task share "$2" enable
	exit
fi


if [ "$1" = "task" ] ; then
	# by default
	shift
fi

docmd ssh $GEARHOST task "$@"

