#!/bin/sh

# Honor user environment
[ -z "${SUDO}" ] && SUDO=sudo
if [ -z "${R2PM_PREFIX}" ]; then
	if [ "`uname`" = Darwin ]; then
		R2PM_PREFIX=/usr/local
	else
		R2PM_PREFIX=/usr/
	fi
fi

# Global Vars
TRAVIS_TYPE=XX
TRAVIS_JOB=86948888
[ -z "${R2PM_PLUGDIR}" ] && R2PM_PLUGDIR="${HOME}/.config/radare2/plugins"
R2PM_USRDIR="${HOME}/.config/radare2/r2pm"
LIBEXT=`r2 -hh | grep LIBEXT | awk '{print $2}' 2> /dev/null`
PREFIX=`r2 -hh | grep PREFIX | awk '{print $2}' 2> /dev/null`
IS_SYSPKG=0

# TODO. support system plugin installs R2PM_PLUGDIR="${R2PM_PREFIX}/lib/radare2/last"

if [ -z "${R2PM_DBDIR}" ]; then
	if [ -d "${PREFIX}/share/radare2/last/r2pm" ]; then
		R2PM_DBDIR="${PREFIX}/share/radare2/last/r2pm"
	fi
fi
if [ -f "d/baleful" ]; then
	R2PM_DBDIR=$(pwd)/d
fi
if [ ! -d "${R2PM_DBDIR}" ]; then
	R2PM_DBDIR=""
	echo "\$R2PM_DBDIR: No such file or directory."
fi

mkdir -p "${R2PM_USRDIR}/pkg"
mkdir -p "${R2PM_USRDIR}/git"
mkdir -p "${R2PM_PLUGDIR}"

R2PM_SYSPKG() {
	IS_SYSPKG="$1"
}

R2PM_DESC() {
	:
}

R2PM_List() {
	cd "${R2PM_USRDIR}/pkg" || exit 1
	if [ -n "$1" ]; then
		ls | grep -i "$1"
	else
		ls | cat
	fi
}

R2PM_Search() {
	cd "${R2PM_DBDIR}" || exit 1
	if [ -n "$1" ]; then
		grep R2PM_DESC * | sed -e "s,:R2PM_DESC,    `printf ' \t'`," -e 's,",,g' | grep -i "$1"
	else
		grep R2PM_DESC * | sed -e "s,:R2PM_DESC,    `printf ' \t'`," -e 's,",,g'
	fi
}

R2PM_ListUninstalled() {
	cd "${R2PM_DBDIR}" || exit 1
	PKGS=$(grep R2PM_DESC * | sed -e "s,:R2PM_DESC,    `printf ' \t'`," -e 's,",,g' |awk '{print $1}')
	for a in ${PKGS} ; do
		if [ ! -f "${R2PM_USRDIR}/pkg/$a" ]; then
			echo $a
		fi
	done
}

R2PM_GIT() {
	URL="$1"
	DIR="`basename $1`"
	cd "${R2PM_USRDIR}/git/"
	if [ -d "${R2PM_USRDIR}/git/${DIR}" ]; then
		cd "${DIR}"
		git pull
	else
		git clone "${URL}" || R2PM_FAIL "Oops"
		cd "${DIR}" || R2PM_FAIL "Oops"
	fi
}

R2PM_FAIL() {
	echo "\033[31mERROR: \033[32m$@\033[0m"
	exit 1
}

R2PM_BEGIN() {
	echo "Processing ${NAME} ..."
	R2PM_GIT=""
}

R2PM_Info() {
	if [ -n "${R2PM_DBDIR}" -a -d "${R2PM_DBDIR}" ]; then
		echo "# Repository Database:"
		cd "${R2PM_DBDIR}"
		echo "# $(ls |wc -l) Packages" > /dev/stderr
	fi
	cd "${R2PM_USRDIR}/pkg"
	echo "# Installed:"
	printf "# $(ls |wc -l) Packages\n#  " > /dev/stderr
	du -hs "${HOME}/.config/radare2" > /dev/stderr
}

R2PM_REGISTER() {
	date > "${R2PM_USRDIR}/pkg/$NAME"
}

R2PM_UNREGISTER() {
	rm -f "${R2PM_USRDIR}/pkg/$NAME"
}

R2PM_END() {
	echo "${ACTION} Done For ${NAME}"
}

case "$1" in
-i|install)
	if [ -z "$2" ]; then
		R2PM_Info
	else
		FILE="${R2PM_DBDIR}/$2"
		if [ -f "${FILE}" ]; then
			NAME="$2"
			ACTION=Install
			. "${FILE}"
			R2PM_INSTALL
			R2PM_REGISTER
		else
			echo "Cannot find file"
		fi
	fi
	;;
-uu)
	FILE="${R2PM_USRDIR}/pkg/$2"
	$0 -u $2 2> /dev/null
	rm -f "${FILE}"
	;;
-u|uninstall)
	FILE="${R2PM_DBDIR}/$2"
	if [ -f "${FILE}" ]; then
		NAME="$2"
		ACTION=Uninstall
		. "${FILE}"
		R2PM_UNINSTALL
		R2PM_UNREGISTER
	else
		echo "Unable to find package template for $2." > /dev/stderr
		echo "Use -uu to remove it from the database." > /dev/stderr
	fi
	;;
-t|test)
	[ -n "$2" ] && TRAVIS_TYPE="$2"
	if [ -n "$3" ]; then
		TRAVIS_JOB="$3"
	else
		TRAVIS_JOB=`curl -s https://api.travis-ci.org/repos?slug=radare%2Fradare2| jq .[0].last_build_id`
		TRAVIS_JOB=$(($TRAVIS_JOB+1))
	fi
	echo $TRAVIS_JOB > /dev/stderr
	# storage
	curl -s https://s3.amazonaws.com/archive.travis-ci.org/jobs/${TRAVIS_JOB}/log.txt |\
		grep -C 1 ${TRAVIS_TYPE} | grep '\[ ' | sed -e 's,\[  \],['${TRAVIS_TYPE}'],g'
# wip
	curl -s https://api.travis-ci.org/jobs/${TRAVIS_JOB}/log.txt |\
		grep -C 1 ${TRAVIS_TYPE} | grep '\[ ' | sed -e 's,\[  \],['${TRAVIS_TYPE}'],g'
	;;
-l|list)
	R2PM_List "$2"
	;;
-s|search)
	R2PM_Search "$2"
	;;
-lu)
	R2PM_ListUninstalled "$2"
	;;
-v|version)
	echo "r2pm v0.1"
	;;
-c|clean)
	R2PM_List radare2 | grep radare2
	if [ $? != 0 ]; then
		rm -rf "${R2PM_USRDIR}/git/"
		mkdir -p "${R2PM_USRDIR}/git/"
	else
		echo "r2 is installed with r2pm, do not clean the cache to avoid autodestruction"
		echo "do not disassemble do not disassemble do not disassemble do not disassemble"
		exit 1
	fi
	;;
*|help|-h)
	echo "Usage: r2pm [cmd] [...]"
	echo "Commands:"
	echo " -i,info                 r2pm -i # pkgs info"
	echo " -i,install <pkgname>    r2pm -i baleful"
	echo " -u,uninstall <pkgname>  r2pm -u baleful (-uu to force)"
	echo " -l,list                 list installed pkgs"
	echo " -lu                     list uninstalled packages"
	echo " -t,test FX,XX,BR BID    check in travis regressions"
	echo " -s,search [<keyword>]   search in database"
	echo " -v,version              show version"
	echo " -h,help                 show this message"
	echo " -c,clean                clear source cache"
	echo "Environment:"
	echo "SUDO=sudo                use this tool as sudo"
	echo "R2PM_PREFIX=/usr         prefix for syspkgs"
	echo "R2PM_PLUGDIR=~/.config/radare2/plugins   # default value, home-install for plugins"
	echo "R2PM_PLUGDIR=/usr/lib/radare2/last/      # for system-wide plugin installs"
	;;
esac
