#!/bin/bash

function usage() {
cat <<HEREDOC
usage: $0 [-t <turn>] [-g <game>] [-f <file>] command [args]
commands:
  build -- pull and rebuild the code
  version -- print the current build number
  setup -- create base directory and config files
  run -- run a turn
  send [id ...] -- send reports to one or more factions, or to all ids in <file>
HEREDOC
exit 1
}

function abort() {
echo $1
[ -z $2 ] && exit -1
exit $2 # otherwise
}

function build() {
assert_dir $SOURCE
cd $SOURCE
rm -rf tolua
git fetch || abort "failed to update source. do you have local changes?"
[ -z $1 ] || git checkout $1
git pull --rebase -q
git submodule update
s/cmake-init
s/build > /dev/null || abort "build failed."
}

function assert_file() {
[ -e $1 ] || abort "missing file: $1"
}

function assert_files() {
while [ ! -z $1 ] ; do
assert_file $1
shift
done
}

function assert_dir() {
[ -d $1 ] || abort "missing directory: $1"
}

function setup() {
assert_dir $SOURCE
assert_dir $LIVE
mkdir -p $TESTROOT
assert_dir $TESTROOT
cd $TESTROOT

cat >| eressea.ini <<HEREDOC
[lua]
dbname = eressea.db
dbswap = :memory:
install = $SOURCE
rules = e$game
HEREDOC
}

function run() {
echo "testing turn $turn of game $game"
assert_dir $TESTROOT
cd $TESTROOT
[ ! -e execute.lock ] || abort "lockfile prevents running game $game"
[ -d data ] || mkdir data
assert_dir data
assert_files $LIVE/orders.$turn $LIVE/data/$turn.dat
ln -f $LIVE/orders.$turn
ln -f $LIVE/data/$turn.dat data/
rm -rf reports
mkdir -p reports

SUPP="$SOURCE/share/debian-7_8.supp"
SERVER="$SOURCE/Debug/eressea/eressea"
VALGRIND=$(which valgrind)
if [ ! -z $VALGRIND ]; then
SERVER="$VALGRIND --quiet --suppressions=$SUPP --error-exitcode=1 --leak-check=no $SERVER"
fi
$SERVER -v$verbose -t$turn $SOURCE/scripts/run-turn.lua
let turn=$turn+1
[ -e data/$turn.dat ] || abort "no data file created"
}

function send() {
zip="$turn-$1.zip"
zip -q -u $zip $turn-$1.?r
email=$(grep "faction=$1:" reports.txt | cut -d: -f2 | sed 's/email=//')
echo "sending reports to $1 / $email"
info=/dev/null
[ -e ../email.txt ] && info=../email.txt
cat $info | mutt -s "Testauswertung Spiel $game Partei $1" -a $zip -- $email
}

game=0
turn=0
verbose=1
factions="testers.txt"
while getopts :g:t:f:v: o; do
  case "${o}" in
  f)
    factions=${OPTARG}
    ;;
  v)
    verbose=${OPTARG}
    ;;
  g)
    game=${OPTARG}
    ;;
  t)
    turn=${OPTARG}
    ;;
  *)
    usage
    ;;
  esac
done
shift $((OPTIND-1))

[ -z $ERESSEA ] && ERESSEA=$HOME/eressea
[ -d $ERESSEA ] || abort "invalid or missing env variable ERESSEA ($ERESSEA)"
[ -z $1 ] && usage
[ -z $SOURCE ] && SOURCE=$ERESSEA/git
[ -d $SOURCE ] || abort "missing source directory: $SOURCE"
[ -d LIVE ] || LIVE=$ERESSEA/game-$game
[ -d TESTROOT ] || TESTROOT=$LIVE/test

while [ ! -z $1 ]; do
case "$1" in
"build")
  shift
  build $*
  ;;
"setup")
  setup
  ;;
"run")
  if [ $turn -eq 0 ]; then
    [ -f $LIVE/turn ] || abort "missing turn file in $LIVE, and no turn specified"
    let turn=$(cat $LIVE/turn)-1
  fi
  run
  ;;
"send")
  shift
  sent=0
  cd $TESTROOT/reports
  if [ $turn -eq 0 ]; then
    [ -f $TESTROOT/turn ] || abort "missing turn file, and no turn specified"
    let turn=$(cat $TESTROOT/turn)
  fi
  [ -f reports.txt ] || abort "missing reports.txt for game $game"
  for faction in $* ; do
    send $faction
    sent=1
  done
  if [ $sent -eq 0 ]; then
    if [ -e ../$factions ]; then
      for faction in $(grep -v -E '^#' ../$factions) ; do
        send $faction
      done
    fi
  fi
  break
  ;;
esac
shift
done