#!/usr/bin/env bash

# Copyright 2012-2015 Nigel Small
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


LATEST_2_0_VERSION="2.0"
LATEST_2_1_VERSION="2.1"
LATEST_2_2_VERSION="2.2"
LATEST_2_3_VERSION="2.3"
LATEST_3_0_VERSION="3.0"
LATEST_VERSION=${LATEST_3_0_VERSION}

SELF=$0
COMMAND=$1
shift

BAU_HOME=`pwd`/`dirname $SELF`
DOWN="${BAU_HOME}/.bau/down"
LOG="${BAU_HOME}/.bau/log"
RUN="${BAU_HOME}/.bau/run"

NEOKIT="python -m neokit"
NEOKIT_SERVER="bau"

DEFAULT_USER="neo4j"
DEFAULT_PASSWORD="neo4j"
NEW_PASSWORD="password"


function install_dependencies {
    if [ "${ONLINE}" ]
    then
        echo "Ensuring dependencies are up to date"
        pip install --upgrade -r test_requirements.txt
        for REQUIREMENTS in "$(find py2neo/ext -name requirements.txt)"
        do
            if [ "${REQUIREMENTS}" != "" ]
            then
                pip install --upgrade -r ${REQUIREMENTS}
            fi
        done
        EXIT_STATUS=$?
        if [ "${EXIT_STATUS}" != "0" ]
        then
            echo "Exiting on code ${EXIT_STATUS} after failure to install dependencies"
            exit ${EXIT_STATUS}
        fi
    fi
}

function check_license {
    pushd "${BAU_HOME}" > /dev/null
    find py2neo -name '*.py' | grep -v -e '^py2neo/ext/' -e '/packages/' | xargs grep -L "http://www.apache.org/licenses/LICENSE-2.0"
    popd > /dev/null
}

function run_tests {
    UNLICENSED=`check_license`
    if [ "$UNLICENSED" ]
    then
        echo "The following files do not contain Apache license details:"
        echo "$UNLICENSED"
        exit 1
    fi
    echo "Running test suite"
    echo ""
    install_dependencies
    pushd "${BAU_HOME}" > /dev/null
    for NEO4J_VERSION in ${NEO4J_VERSIONS}
    do
        print_version_banner ${NEO4J_VERSION}
        ${NEOKIT} install ${NEOKIT_SERVER} ${NEO4J_VERSION}
        check_exit_status $?

        mkdir -p "${LOG}/${NEO4J_VERSION}" 2> /dev/null

        echo "Updating password"
        ${NEOKIT} update-password ${NEOKIT_SERVER} ${DEFAULT_USER} ${DEFAULT_PASSWORD} ${NEW_PASSWORD}

        echo ""
        export NEO4J_URI="http://localhost:7474/"
        export NEO4J_AUTH="neo4j:${NEW_PASSWORD}"
        ${NEOKIT} run ${NEOKIT_SERVER} ${BAU_HOME}/runtests.sh $*
        EXIT_STATUS=$?

        ${NEOKIT} uninstall ${NEOKIT_SERVER}

        rm -rf "${LOG}/${NEO4J_VERSION}/htmlcov"

        echo ""
        check_exit_status ${EXIT_STATUS}
    done
    popd > /dev/null
    echo ""
    echo "Test suite completed successfully"
    echo ""
}

function check_exit_status {
    EXIT_STATUS=$1
    if [ ${EXIT_STATUS} -ne 0 ]
    then
        echo "Exiting on code ${EXIT_STATUS} after test failure"
        exit ${EXIT_STATUS}
    fi
}

function build_book {
    install_dependencies
    make -C ${BAU_HOME}/book html
    xdg-open ${BAU_HOME}/book/_build/html/index.html 2> /dev/null
}

function print_version_banner {
    if [ "$1" == "3.0" ] || [ "$1" == "" ]
    then
        echo ""
        echo ":::   ::::                  ::     ''     .::::.     ::::"
        echo " :::.  ::  :::::   :::::   ::     :::     ''  ::    ::  ::"
        echo " :: :: :: ::...:: ::   :: ::  ::   ::       :::     ::  ::"
        echo " ::  '::: ::''''' ::   :: :::::::  ::     ..  ::    ::  ::"
        echo "::::   ::  :::::   :::::      ::   ::     '::::' ::  ::::"
        echo "                                 :::"
        echo ""
    elif [ "$1" == "2.3" ]
    then
        echo ""
        echo ":::   ::::                  ::     ''     .::::.    .::::."
        echo " :::.  ::  :::::   :::::   ::     :::     ''  ::    ''  ::"
        echo " :: :: :: ::...:: ::   :: ::  ::   ::       .:'       ::: "
        echo " ::  '::: ::''''' ::   :: :::::::  ::     .:'       ..  ::"
        echo "::::   ::  :::::   :::::      ::   ::     :::::: :: '::::'"
        echo "                                 :::"
        echo ""
    elif [ "$1" == "2.2" ]
    then
        echo ""
        echo ":::   ::::                  ::     ''     .::::.    .::::."
        echo " :::.  ::  :::::   :::::   ::     :::     ''  ::    ''  ::"
        echo " :: :: :: ::...:: ::   :: ::  ::   ::       .:'       .:' "
        echo " ::  '::: ::''''' ::   :: :::::::  ::     .:'       .:'   "
        echo "::::   ::  :::::   :::::      ::   ::     :::::: :: ::::::"
        echo "                                 :::"
        echo ""
    elif [ "$1" == "2.1" ]
    then
        echo ""
        echo ":::   ::::                  ::     ''     .::::.     .::"
        echo " :::.  ::  :::::   :::::   ::     :::     ''  ::    ''::"
        echo " :: :: :: ::...:: ::   :: ::  ::   ::       .:'       ::"
        echo " ::  '::: ::''''' ::   :: :::::::  ::     .:'         ::"
        echo "::::   ::  :::::   :::::      ::   ::     :::::: :: ::::::"
        echo "                                 :::"
        echo ""
    elif [ "$1" == "2.0" ]
    then
        echo ""
        echo ":::   ::::                  ::     ''     .::::.     ::::"
        echo " :::.  ::  :::::   :::::   ::     :::     ''  ::    ::  ::"
        echo " :: :: :: ::...:: ::   :: ::  ::   ::       .:'     ::  ::"
        echo " ::  '::: ::''''' ::   :: :::::::  ::     .:'       ::  ::"
        echo "::::   ::  :::::   :::::      ::   ::     :::::: ::  ::::"
        echo "                                 :::"
        echo ""
    fi
}

case ${COMMAND} in
    book)
        build_book
        ;;
    check-license)
        check_license
        ;;
    test)
        NEO4J_VERSIONS="3.0 2.3 2.2 2.1 2.0"
        run_tests $*
        ;;
    test-latest)
        NEO4J_VERSIONS="3.0"
        run_tests $*
        ;;
    test-3.0)
        NEO4J_VERSIONS="3.0"
        run_tests $*
        ;;
    test-2.3)
        NEO4J_VERSIONS="2.3"
        run_tests $*
        ;;
    test-2.2)
        NEO4J_VERSIONS="2.2"
        run_tests $*
        ;;
    test-2.1)
        NEO4J_VERSIONS="2.1"
        run_tests $*
        ;;
    test-2.0)
        NEO4J_VERSIONS="2.0"
        run_tests $*
        ;;
esac
