#!/bin/bash

BASEDIR=`dirname $0`
. $BASEDIR/base.sh

if [ "$BUILD" = "" ]; then
  BUILD=debug
fi

ARCH=`uname -m`
if [ "$CLICK" = "" ]; then
  CLICK=$BASEDIR/../$ARCH/$BUILD/bin/click
fi

if [ "$RESULTS" = "" ]; then
  RESULTS=/mnt/`uname -n`/data/results
fi

if [ "$CONFS" = "" ]; then
  CONFS=$BASEDIR/../confs
fi

if [ "$FILTER" = "" ]; then
  FILTER=cat
fi

if [ "$FILE_FORMAT" = "" ]; then
  FILE_FORMAT=pcap
fi

DAG=""
if [ "$FILE_FORMAT" = "erf" ]; then
  DAG=DAG
fi
export DAG

if [ "$CONCATCAP" = "" ]; then
  if [ "$FILE_FORMAT" = "pcap" ]; then
    CONCATCAP=$BASEDIR/concatcap
  elif [ "$FILE_FORMAT" = "erf" ]; then
    CONCATCAP=$BASEDIR/concaterf
  else
    echo "Invalid FILE_FORMAT $FILE_FORMAT" 1>&2
    exit 1
  fi
fi

FILE_PATTERN="*.$FILE_FORMAT*"

if [ "$2" = "" ]; then
  echo "No configuration file specified!"
  exit 1
fi
CONFIG=$2

CONFIG_FILE=$CONFS/$CONFIG.click

if [ ! -f $CONFIG_FILE ]; then
  CONFIG_FILE=$CONFS/click/$CONFIG.click
  if [ ! -f $CONFIG_FILE ]; then
    CONFIG_FILE=$CONFIG
    if [ ! -f $CONFIG_FILE ]; then
      echo "$CONFIG_FILE: configuration file doesn't exist!" 1>&2
      exit 1
    fi
    CONFIG=`basename "${CONFIG%.click}"`
  fi
fi

TAG=$CONFIG

if [ "$3" != "" ]; then
  TAG="$CONFIG/$3"
fi

RESULTS=$RESULTS/$DATASET/click/$TAG

echo "RESULTS is set to: $RESULTS"

export RESULTS

if [ ! -d $RESULTS ]; then
  mkdir -p $RESULTS
  if [ "$?" != "0" ]; then
    exit 1
  fi
fi

if [ -x $CONFIG_FILE.hook ]; then
  . $CONFIG_FILE.hook
fi

RUN_N=1
while [ -f $RESULTS/time_stats$RUN_N ]; do
  let RUN_N+=1
done

grep '@TRACE_PIPE@' $CONFIG_FILE > /dev/null 2>&1
if [ "$?" == "0" ]; then
  TRACE_PIPE="/tmp/`basename $CONFIG`$$"
  export TRACE_PIPE
fi

CONF_CLICK=$RESULTS/conf.click$RUN_N
$BASEDIR/preprocessor.pl -E -Fsubstitution $CONFIG_FILE > $CONF_CLICK
if [ "$?" != "0" ]; then
  exit 1
fi

if [ "$SINGLE_TRACE" = "" ]; then
  FILES=`find $TRACES_REPOS/$DATASET -iname "$FILE_PATTERN"`
  if [ "$FILES" = "" ]; then
    FILE_PATTERN="*[0-9].[0-9][0-9][0-9][0-9][0-9][0-9]"
    FILES=`find $TRACES_REPOS/$DATASET -iname "$FILE_PATTERN"`
    if [ "$FILES" = "" ]; then
      echo "Could not find files in $TRACES_REPOS/$DATASET matching *.$FILE_FORMAT*" 1>&2
      exit 1
    fi
  fi
else
  FILES="$SINGLE_TRACE"
fi

if [ "$GNUTIME" != "" ]; then
  if [ "x$RUN_CLICK_DEBUG" = "x" ]; then
    if [ "$TRACE_PIPE" != "" ]; then
      mkfifo $TRACE_PIPE
      if [ "$SINGLE_TRACE" = "" ]; then
        find $TRACES_REPOS/$DATASET -iname "$FILE_PATTERN" | sort | $FILTER | $CONCATCAP > $TRACE_PIPE &
      else
        cat "$SINGLE_TRACE" > $TRACE_PIPE &
      fi
      $GNUTIME -o $RESULTS/time_stats$RUN_N $CLICK $CONF_CLICK 2> $RESULTS/stderr$RUN_N
    else
      if [ "$SINGLE_TRACE" = "" ]; then
        find $TRACES_REPOS/$DATASET -iname "$FILE_PATTERN" | sort | $FILTER | $CONCATCAP | $GNUTIME -o $RESULTS/time_stats$RUN_N $CLICK $CONF_CLICK 2> $RESULTS/stderr$RUN_N
      else
        cat "$SINGLE_TRACE" | $GNUTIME -o $RESULTS/time_stats$RUN_N $CLICK $CONF_CLICK 2> $RESULTS/stderr$RUN_N
      fi
    fi
  else
    echo "find $TRACES_REPOS/$DATASET -iname \"$FILE_PATTERN\" | sort | $FILTER | $CONCATCAP | $GNUTIME -o $RESULTS/time_stats$RUN_N $CLICK $CONF_CLICK"
  fi
else
  if [ "x$RUN_CLICK_DEBUG" = "x" ]; then
    if [ "$TRACE_PIPE" != "" ]; then
      mkfifo $TRACE_PIPE
      find $TRACES_REPOS/$DATASET -iname "$FILE_PATTERN" | sort | $FILTER | $CONCATCAP > $TRACE_PIPE &
      time $CLICK $CONF_CLICK 2> $RESULTS/stderr$RUN_N
    else
      time find $TRACES_REPOS/$DATASET -iname "$FILE_PATTERN" | sort | $FILTER | $CONCATCAP | $CLICK $CONF_CLICK 2> $RESULTS/stderr$RUN_N
    fi
  else
    echo "time find $TRACES_REPOS/$DATASET -iname \"$FILE_PATTERN\" | sort | $FILTER | $CONCATCAP | $CLICK $CONF_CLICK"
  fi
fi

CLICK_EXIT=$?

if [ "$TRACE_PIPE" != "" ]; then
  rm $TRACE_PIPE
fi

if [ "$CLICK_EXIT" != "0" ]; then
  echo "Click exited with status $CLICK_EXIT" 1>&2
  cat $RESULTS/stderr$RUN_N 1>&2
  echo "Click exited with status $CLICK_EXIT" 1>&2
  exit 1
fi

ls -lh $RESULTS
if [ "$GNUTIME" != "" ]; then
  echo "$RESULTS/time_stats$RUN_N:"
  cat $RESULTS/time_stats$RUN_N
fi

