#!/usr/bin/bash

safe_run()
{
    "$@"
    exit_status=$?
    if [[ $exit_status -ne 0 ]]; then
        echo "==> FAILED with exit status $exit_status"
        exit $exit_status
    fi
}

print_help()
{
    echo "help: $0 [-g ACCOUNT:BRANCH] [-n] [-P|-p YYYYMMDD-HHMM|-T <package-name>] <label>"
    echo "Options:"
    echo "    -g"
    echo "       Specify a GitHub ACCOUNT:BRANCH for the 'vm-test-runs' repository (default: opensciencegrid:master)"
    echo "    -n"
    echo "       Run as nightly test i.e. immediately submit the DAG after setting up the test run"
    echo "    -P"
    echo "       Use yaml parameters for testing the prerelease repos"
    echo "    -p YYYYMMDD-HHMM"
    echo "       Use yaml parameters from a previous run with given timestamp"
    echo "    -T <package-name>"
    echo "       Use predefined yaml parameters for promoting the given package"
    echo '    -h, -help, --help'
    echo "       Print this dialogue"

}

TEST_HOME=/osgtest/runs
NIGHTLY=0
PRERELEASE=0
PROMOTION_BASE=""
PARAMETERS_BASE=""
GH_ACCOUNT=opensciencegrid
GH_BRANCH=master

set_parameters_base()
{
    case $1 in
        20[0-9][0-9][0-1][0-9][0-3][0-9]-[0-2][0-9][0-5][0-9])
            PARAMETERS_BASE=$TEST_HOME/run-$1/parameters.d
            if ! [ -d "$PARAMETERS_BASE" ]; then
                echo "No such directory: '$PARAMETERS_BASE'"
                print_help
                exit 1
            fi
            ;;
        *)
            echo "Option '-p' takes a YYYYMMDD-HHMM argument."
            print_help
            exit 1
            ;;
    esac
}

set_github_info()
{
    if [[ "$1" =~ ^[A-Za-z0-9_-]*:[./A-Za-z0-9_-]*$ ]]; then
        GH_ACCOUNT="${1%:*}"
        GH_BRANCH="${1#*:}"
    else
        echo "Option '-g' takes an ACCOUNT:BRANCH argument."
        print_help
        exit 1
    fi
}

# Parse options and required label arg
while getopts :g:nhPp:T: opt; do
    case $opt in
        g)
            set_github_info "$OPTARG"
            ;;
        n)
            NIGHTLY=1
            ;;
        h)
            print_help
            exit 0
            ;;
        P)  PRERELEASE=1
            ;;
	T)  PROMOTION_BASE="$OPTARG"
	    ;;
        p)
            set_parameters_base "$OPTARG"
            ;;
        \?)
            echo "Invalid option: -$opt"
            print_help
            exit 1
            ;;
    esac
done

shift $(($OPTIND-1)) # Pop options we've already read

if [[ $# -ne 1 ]]; then
    echo "ERROR: Received incorrect number of arguments: $#. Expecting one 'label' argument"
    print_help
    exit 1
fi

LABEL="$1"
if [[ ! -d $TEST_HOME ]]; then
    safe_run mkdir -p $TEST_HOME
fi

RUN_DIR_NAME=`date '+run-%Y%m%d-%H%M'`
RUN_DIRECTORY=$TEST_HOME/$RUN_DIR_NAME
echo "Run directory: $RUN_DIRECTORY"

# Prepare the run directory
safe_run git clone --quiet --depth 1 --branch "$GH_BRANCH" https://github.com/"$GH_ACCOUNT"/vm-test-runs.git $RUN_DIRECTORY

if [ $PRERELEASE -eq 1 ] && [ -n "$RUN_DIRECTORY" ]; then
    echo "Using parameters for prerelease tests"
    # Non-destructively replace the original yaml set with new yaml
    # Avoid running rm -f programmatically
    mkdir -p $RUN_DIRECTORY/parameters.d-orig/
    safe_run mv $RUN_DIRECTORY/parameters.d/*.yaml $RUN_DIRECTORY/parameters.d-orig/
    safe_run cp -r $RUN_DIRECTORY/parameters.d-prerelease/*.yaml $RUN_DIRECTORY/parameters.d
fi

if [ -n "$PARAMETERS_BASE" ] && [ -n "$RUN_DIRECTORY" ]; then
    echo "Copying run parameters from $PARAMETERS_BASE"
    mkdir -p $RUN_DIRECTORY/parameters.d-orig/
    safe_run mv $RUN_DIRECTORY/parameters.d/*.yaml $RUN_DIRECTORY/parameters.d-orig/
    safe_run cp "$PARAMETERS_BASE"/*.yaml $RUN_DIRECTORY/parameters.d/
fi

if [ -n "$PROMOTION_BASE" ] && [ -n "$RUN_DIRECTORY" ] ; then
    echo "Copying run parameters from $PROMOTION_BASE"
    mkdir -p $RUN_DIRECTORY/parameters.d-orig/
    safe_run mv $RUN_DIRECTORY/parameters.d/*.yaml $RUN_DIRECTORY/parameters.d-orig/
    safe_run cp "$RUN_DIRECTORY"/parameters.d-promotion/$PROMOTION_BASE/*.yaml $RUN_DIRECTORY/parameters.d/
fi

cp /osgtest/rpms/osg-test-*.rpm $RUN_DIRECTORY/ 2> /dev/null
cd $RUN_DIRECTORY
if [ "x$TEMP_DIR" != 'x' ]; then
    rm -fr "$TEMP_DIR"
fi

# Populate master-run.dag with DAG variables
safe_run sed "s|@RUN_DIRECTORY@|$RUN_DIRECTORY|g" jobs/master-run.dag.in > $RUN_DIRECTORY/jobs/master-run.dag

if [ $NIGHTLY -eq 1 ]; then
    echo "$LABEL" > $RUN_DIRECTORY/run_label
    ./master-run.sh
else
    echo "$LABEL ($USER)" > $RUN_DIRECTORY/run_label
    echo 'Run tests with:'
    echo "    cd $RUN_DIRECTORY"
    echo '    ./master-run.sh'
    exit 0
fi
