#!/bin/bash

NUM_OF_CORES=''
TRIAL_PATH=''

function getTrialAbsolutePath {
    TRIAL_PATH="$(which trial)"
}

function resolveNumOfCores {
        if [ "$(uname)" ==  "Darwin" ]; then
                NUM_OF_CORES="$(sysctl -n hw.ncpu)"
        else
                NUM_OF_CORES="$(nproc)"
        fi
}

function setuppy {
        echo "Installing Pixelated User Agent."
        pip install -r develop_requirements.txt
        pip install -r test_requirements.txt
        python setup.py develop $*
        pip uninstall -y scrypt; pip install scrypt
        pip uninstall -y gnupg; pip install gnupg==2.0.2
        echo "Done."
}

function setupjs {
        echo "Installing node and bower libraries."
        cd ../web-ui
        npm install
        node_modules/bower/bin/bower install --config.interactive=false --allow-root
        LC_ALL=en_US.UTF-8 ./go build
        cd -
        echo "Done."
}

function runIntegrationTests {
        echo "Executing Integration Tests."
        resolveNumOfCores
        trial -j $NUM_OF_CORES --reporter=text $* test.integration
        echo "Done."
}

function runUnitTests {
        echo "Executing Unit Tests."
        trial --reporter=text $* test.unit
        echo "Done."
}

function runPep8 {
        echo "Verifying conformation to pep8."
        pep8 pixelated test --ignore=E501
        echo "Done."
}

function runJSHint {
        echo "Executing JSHint."
        cd ../web-ui
        LC_ALL=en_US.UTF-8 ./go jshint
        cd -
        echo "Done."
}

function runCoverageUnit {
        echo "Generating Unit Test Converage Information."
        coverage erase
        getTrialAbsolutePath
        coverage run -p --source=pixelated $TRIAL_PATH --reporter=text $* test.unit
        coverage combine
        coverage html
        echo "Done."
}

function runCoverageIntegration {
        echo "Generating Integration Test Converage Information."
        coverage erase
        getTrialAbsolutePath
        coverage run -p --source=pixelated $TRIAL_PATH --reporter=text $* test.integration
        coverage combine
        coverage html
        echo "Done."
}

function runCoverageUnitAndIntegration {
        echo "Generating Unit and Integration Test Converage Information."
        coverage erase
        getTrialAbsolutePath
        coverage run -p --source=pixelated $TRIAL_PATH --reporter=text test.unit
        coverage run -p --source=pixelated $TRIAL_PATH --reporter=text test.integration
        coverage combine
        coverage html
        echo "Done."
}

function runFunctionalTests {
        echo "Executing Functional Tests on headless PhantomJS."
        echo "You should execute it on Debian box for more similar results with CI environment."
        behave --tags ~@wip test/functional/features
        echo "Done."
}

if [ "$1" == 'test' ]; then
        set -e
        runPep8
        runUnitTests "${@:2}"
        runIntegrationTests "${@:2}"
elif [ "$1" == 'unit' ]; then
        set -e
        runUnitTests
elif [ "$1" == 'integration' ]; then
        set -e
        runIntegrationTests
elif [ "$1" == 'pep8' ]; then
        set -e
        runPep8
elif [ "$1" == 'setuppy' ]; then
        setuppy
elif [ "$1" == 'setupjs' ]; then
        setupjs
elif [ "$1" == 'setup' ]; then
        setupjs
        setuppy "${@:2}"
elif [ "$1" == 'coverage_unit' ]; then
        runCoverageUnit "${@:2}"
elif [ "$1" == 'coverage_integration' ]; then
        runCoverageIntegration "${@:2}"
elif [ "$1" == 'coverage_all' ]; then
        set -e
        runPep8
        runCoverageUnitAndIntegration "${@:2}"
elif [ "$1" == 'start' ]; then
        /usr/bin/env pixelated-user-agent "${@:2}"
elif [ "$1" == "functional" ]; then
        runFunctionalTests "${@:2}"
else
        python setup.py $*
fi