#!/bin/bash

export NC='\e[0m'
export RED='\e[0;31m'
export GREEN='\e[0;32m'

THIS_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
cd "$THIS_SCRIPT_DIR" || exit 1

#################################################
# Run resource tests.
# Arguments:
#   none
#################################################
checkResources () {
    clear
    echo "#################################################################" >&2
    echo " Checking documentation" >&2
    echo "#################################################################" >&2
    echo "" >&2

#    ./additionalTests.sh -s lintScss
#    EXIT_CODE_SCSS=$?

#    ./additionalTests.sh -s lintTypescript
#    EXIT_CODE_TYPESCRIPT=$?

#    ./additionalTests.sh -s lintXliff
#    EXIT_CODE_XLIFF=$?

    ./additionalTests.sh -s buildDocumentation
    EXIT_CODE_DOCUMENTATION=$?

    echo "#################################################################" >&2
    echo " Checked documentation" >&2
    if [[ ${EXIT_CODE_SCSS} -eq 0 ]] && \
        [[ ${EXIT_CODE_TYPESCRIPT} -eq 0 ]] && \
        [[ ${EXIT_CODE_XLIFF} -eq 0 ]] && \
        [[ ${EXIT_CODE_DOCUMENTATION} -eq 0 ]]
    then
        echo -e "${GREEN}Resources valid${NC}" >&2
    else
        echo -e "${RED}Resources invalid${NC}" >&2
        exit 1
    fi
    echo "#################################################################" >&2
    echo "" >&2

    ./additionalTests.sh -s clean
}

#################################################
# Run test matrix.
# Arguments:
#   php version
#   typo3 version
#   testing framework version
#   test path
#   prefer lowest
#################################################
runFunctionalTests () {
    local PHP_VERSION="${1}"
    local TYPO3_VERSION=${2}
    local TESTING_FRAMEWORK=${3}
    local TEST_PATH=${4}
    local PREFER_LOWEST=${5}

    clear
    echo "###########################################################################" >&2
    echo " Run unit and/or functional tests with" >&2
    echo " - TYPO3 ${TYPO3_VERSION}" >&2
    echo " - PHP ${PHP_VERSION}">&2
    echo " - Testing framework ${TESTING_FRAMEWORK}">&2
    echo " - Test path ${TEST_PATH}">&2
    echo " - Additional ${PREFER_LOWEST}">&2
    echo "###########################################################################" >&2
    echo "" >&2

    ./runTests.sh -s cleanTests

    ./runTests.sh \
        -p ${PHP_VERSION} \
        -s lintPhp || exit 1 ; \
        EXIT_CODE_LINT=$?

    ./runTests.sh \
        -p ${PHP_VERSION} \
        -s composer require ${PREFER_LOWEST} "typo3/cms-core:${TYPO3_VERSION}" || exit 1 ; \
        EXIT_CODE_CORE=$?

    ./runTests.sh \
        -p ${PHP_VERSION} \
        -s composer require --dev ${PREFER_LOWEST} "typo3/testing-framework:${TESTING_FRAMEWORK}" || exit 1 ; \
        EXIT_CODE_FRAMEWORK=$?

    ./runTests.sh \
        -p ${PHP_VERSION} \
        -s composerValidate || exit 1 ; \
        EXIT_CODE_VALIDATE=$?

    ./runTests.sh \
        -p ${PHP_VERSION} \
        -d sqlite \
        -s functional ${TEST_PATH} || exit 1 ; \
        EXIT_CODE_FUNCTIONAL=$?

    echo "###########################################################################" >&2
    echo " Finished unit and/or functional tests with" >&2
    echo " - TYPO3 ${TYPO3_VERSION}" >&2
    echo " - PHP ${PHP_VERSION}">&2
    echo " - Testing framework ${TESTING_FRAMEWORK}">&2
    echo " - Test path ${TEST_PATH}">&2
    echo " - Additional ${PREFER_LOWEST}">&2
    if [[ ${EXIT_CODE_LINT} -eq 0 ]] && \
        [[ ${EXIT_CODE_INSTALL} -eq 0 ]] && \
        [[ ${EXIT_CODE_CORE} -eq 0 ]] && \
        [[ ${EXIT_CODE_FRAMEWORK} -eq 0 ]] && \
        [[ ${EXIT_CODE_VALIDATE} -eq 0 ]] && \
        [[ ${EXIT_CODE_FUNCTIONAL} -eq 0 ]]
    then
        echo -e "${GREEN}SUCCESS${NC}" >&2
    else
        echo -e "${RED}FAILURE${NC}" >&2
        exit 1
    fi
    echo "#################################################################" >&2
    echo "" >&2
    cleanup
}

#################################################
# Removes all files created by tests.
# Arguments:
#   none
#################################################
cleanup () {
    ./runTests.sh -s clean
    ./additionalTests.sh -s clean
}

LOWEST="--prefer-lowest"
TPATH="Tests/Functional"

DEBUG_TESTS=false
if [[ $DEBUG_TESTS != true ]]; then
    checkResources

    TCORE="^13.0"
    TFRAMEWORK="^9.2.1"
    runFunctionalTests "8.2" ${TCORE} ${TFRAMEWORK} ${TPATH} || exit 1
    runFunctionalTests "8.2" ${TCORE} ${TFRAMEWORK} ${TPATH} ${LOWEST} || exit 1
    runFunctionalTests "8.3" ${TCORE} ${TFRAMEWORK} ${TPATH} || exit 1
    runFunctionalTests "8.3" ${TCORE} ${TFRAMEWORK} ${TPATH} ${LOWEST} || exit 1
    runFunctionalTests "8.4" ${TCORE} ${TFRAMEWORK} ${TPATH} || exit 1
    runFunctionalTests "8.4" ${TCORE} ${TFRAMEWORK} ${TPATH} ${LOWEST} || exit 1

    TCORE="^14.0"
    TFRAMEWORK="dev-main"
    runFunctionalTests "8.2" ${TCORE} ${TFRAMEWORK} ${TPATH} || exit 1
    runFunctionalTests "8.2" ${TCORE} ${TFRAMEWORK} ${TPATH} ${LOWEST} || exit 1
    runFunctionalTests "8.3" ${TCORE} ${TFRAMEWORK} ${TPATH} || exit 1
    runFunctionalTests "8.3" ${TCORE} ${TFRAMEWORK} ${TPATH} ${LOWEST} || exit 1
    runFunctionalTests "8.4" ${TCORE} ${TFRAMEWORK} ${TPATH} || exit 1
    #runFunctionalTests "8.4" ${TCORE} ${TFRAMEWORK} ${TPATH} ${LOWEST} || exit 1
    runFunctionalTests "8.5" ${TCORE} ${TFRAMEWORK} ${TPATH} || exit 1
    #runFunctionalTests "8.5" ${TCORE} ${TFRAMEWORK} ${TPATH} ${LOWEST} || exit 1
else
    #cleanup
    runFunctionalTests "8.2" "^14.0" "dev-main" ${TPATH} ${LOWEST} || exit 1
    # ./runTests.sh -x -p 8.2 -d sqlite -s functional -e "--group selected" Tests/Functional
    # ./runTests.sh -x -p 8.2 -d sqlite -s functional Tests/Functional
fi
