#!/bin/bash

if [ "$2" = "" ]; then
	echo -e "\nusage: $0 [ options ] SRPM distro [ min_ver [, max_ver [, mock_options ]]]\n"
	echo -e "\t--redis            store build command in redis queue"
	echo -e "\t--valkey           store build command in valkey queue"
	echo -e "\t--list             list queue content"
	echo -e "\t--nobase | --scl   only build PHP SCL packages"
	echo -e "\t--noscl | --base   only build PHP base packages"
	echo -e "\t--mock             distro is a mock config name\n"
	echo -e "Special distro: all, zts, memcached, im6, im7\n"
	exit 0
fi

# Script options
BUILD_BASE=1
BUILD_SCLS=1
BUILD_MOCK=0
REDIS=0
REMOTE=0

# ARCH detection and check
if [ "$(uname -m)" = "x86_64" ]; then
	SUF=x
	QUEUE=mockx
	REDISCLI="valkey-cli"
else
	SUF=a
	QUEUE=mocka
	REDISCLI="valkey-cli -h remi"
fi

if [ "$1" == "--redis" -o "$1" == "--valkey" ]; then
	CHECK=$($REDISCLI ping)
	[ "$CHECK" = "PONG" ] || exit 1
	REDIS=1
	shift
fi

# Queue commands
if [ "$1" == "--list" ]; then
	echo "-- x86_64 queue: $($REDISCLI scard mockx) tasks --"
	a=$($REDISCLI smembers mockx)
	[ -n "$a" ] && $REDISCLI smembers mockx | \
       sed -e 's/^.*-r /  /;s/rebuild/\t/;s:/.*/::' | sort | head -n 25 || \
       ps -ef | grep mock/mock | grep -v grep

	echo -e "\n-- aarch64 queue: $($REDISCLI scard mocka) tasks --"
	a=$($REDISCLI smembers mocka)
	[ -n "$a" ] && $REDISCLI smembers mocka  | \
      sed -e 's/^.*-r /  /;s/rebuild/\t/;s:/.*/::'| sort || \
      ps -ef | ssh remi@ampere 'ps -ef | grep mock/mock | grep -v grep'

	exit 0
elif [ "$1" == "--clean" ]; then
	$REDISCLI del mockx
	$REDISCLI del mocka
	exit 0
fi

if [ "$1" == "--nobase" -o "$1" == "--scl" ]; then
	BUILD_BASE=0
	shift
elif [ "$1" == "--noscl" -o "$1" == "--base" ]; then
	BUILD_SCLS=0
	shift
elif [ "$1" == "--mock" ]; then
	BUILD_BASE=0
	BUILD_SCLS=0
	BUILD_MOCK=1
	shift
fi

SRPM=$1
DIST=$2
shift 2

# PHP version build range
if [ "$1" = "" ]; then
	MIN=56
else
	MIN=$1
	shift
fi
if [ "$1" = "" ]; then
	MAX=84
else
	MAX=$1
	shift
fi

case $DIST in
	*x|*xm|*xr)
		if [ $SUF != x ]; then
			echo "Not an x86_64 builder"
			exit 1
		fi
		;;
	*a|*am|*ar)
		if [ $SUF != a ]; then
			if [ $REDIS -ge 1 ]; then
				REMOTE=1
			else
				echo "Not an aarch64 builder"
				exit 1
			fi
		fi
		;;
esac

# SRPM abolute path
mockref=/home/rpmbuild/SPECS/remirepo/tools/mock
mocketc=$mockref
srpmdir=/home/rpmbuild/site/rpms/SRPMS
case $DIST in
	*a|*am)
		mocketc=/home/remi/mock
		srpmdir=/home/remi/SRPMS
		;;
esac

if [ -f $srpmdir/$SRPM ]; then
	SRPM=$srpmdir/$SRPM
elif [ -f $PWD/$SRPM ]; then
	SRPM=$PWD/$SRPM
elif [ ! -f $SRPM ]; then
	echo "file not found '$SRPM'"
	exit 1
fi

# Send to remote aarch64 builder
if [ $REMOTE -ge 1 ]; then
	LST=/tmp/srpm_aarch64_sent.list
	touch $LST
	if ! grep -q $SRPM $LST; then
		scp $SRPM remi@ampere:todo/
		echo $SRPM >>$LST
	fi
	mocketc=/home/remi/mock
	QUEUE=mocka
	SRPM=/home/remi/todo/$(basename $SRPM)
fi

# PHP version matrix
echo mockit $SRPM $DIST $MIN $MAX $@
case $DIST in
	fc42x|fc42a|fc40x|fc40a|fc41x|fc41a|el9x|el9a|el10x|el10a)
		LST="74 80 81 82 83 84"
		SCL="74 80 81 82 83 84"
		;;
	el8a)
		LST="72 73 74 80 81 82 83 84"
		SCL="72 73 74 80 81 82 83 84"
		;;
	el8x)
		LST="72 73 74 80 81 82 83 84"
		SCL="56 70 71 72 73 74 80 81 82 83 84"
		;;
	all)
		if [ $REDIS -ge 1 ]; then
			for i in fc40x fc41x fc42x el8x el9x el10x fc40a fc41a fc42a el8a el9a el10a
			do
				[ $BUILD_BASE -ge 1 ] && $0 --valkey --base $SRPM $i $MIN $MAX $@
				[ $BUILD_SCLS -ge 1 ] && $0 --valkey --scl  $SRPM $i $MIN $MAX $@
			done
		else
			echo Not supported for direct build
		fi
		;;
	zts)
		if [ $REDIS -ge 1 ]; then
			[ $MAX -gt 83 ] && MAX=83
			for i in fc40x el8x el9x
			do
				[ $BUILD_BASE -ge 1 ] && $0 --valkey --base $SRPM $i $MIN $MAX $@
			done
		else
			echo Not supported for direct build
		fi
		;;
	memcached)
		if [ $REDIS -ge 1 ]; then
			for i in fc40xm fc41x fc42x el8x el9xm el10xm fc40am fc41a fc42a el8a el9am el10am
			do
				$0 --valkey --mock $SRPM $i $MIN $MAX $@
			done
		else
			echo Not supported for direct build
		fi
		;;
	im6)
		if [ $REDIS -ge 1 ]; then
			for i in fc40x el8xr el9x fc40a el8ar el9a
			do
				$0 --valkey --mock $SRPM $i $MIN $MAX $@
			done
		else
			echo Not supported for direct build
		fi
		;;
	im7)
		if [ $REDIS -ge 1 ]; then
			for i in fc40x fc41x fc42x el8xr el9x el10x fc40a fc41a fc42a el8ar el9a el10a
			do
				$0 --valkey --mock $SRPM $i $MIN $MAX $@
			done
		else
			echo Not supported for direct build
		fi
		;;
	*)
		if [ $BUILD_MOCK -eq 0 -o ! -f ${mockref}/${DIST}.cfg ]; then
			[ $BUILD_MOCK -eq 0  ] && echo "BUILD_MOCK=0"
			[ ! -f ${mocketc}/${DIST}.cfg ] && echo "${mockref}/${DIST}.cfg missing"
			echo Unkown DIST $DIST
			exit 1
		fi
		;;
esac

ID=${QUEUE:-$PPID}

# Build base/modules
[ $BUILD_BASE -ge 1 ] && for i in $LST
do
	if [ 0$i -ge $MIN -a 0$i -le $MAX ]; then
		CMD="mock -q --configdir=$mocketc -r ${DIST}${i} rebuild $SRPM $@"
		if [ $REDIS -ge 1 ]; then
			$REDISCLI sadd $QUEUE "$CMD"
		else
			echo -n "$(date +%X)    $i "
			$CMD --uniqueext=$ID && echo " Ok." || echo " Error !"
		fi
	fi
done
# Build Software Collections
[ $BUILD_SCLS -ge 1 ] && for i in $SCL
do
	if [ 0$i -ge $MIN -a 0$i -le $MAX ]; then
		CMD="mock -q --configdir=$mocketc -r ${DIST}scl${i} rebuild $SRPM $@"
		if [ $REDIS -ge 1 ]; then
			$REDISCLI sadd $QUEUE "$CMD"
		else
			echo -n "$(date +%X) scl$i "
			$CMD --uniqueext=$ID && echo " Ok." || echo " Error !"
		fi
	fi
done
# Build using mock config
if [ $BUILD_MOCK -ge 1 ]; then
	CMD="mock -q --configdir=$mocketc -r ${DIST} rebuild $SRPM $@"
	$REDISCLI sadd $QUEUE "$CMD"
fi

if [ $REDIS -ge 1 ]; then
	echo "Queue size: " $($REDISCLI scard $QUEUE)
else
	date +%X
fi