#!/usr/bin/env bash

### Environment variables

ANSIBLE_VERSION="devel"
PYTHON_VERSION="3.7"

###

set -o pipefail -eux

declare -a args
IFS='/:' read -ra args <<< "$1"

script="${args[0]}"

test="$1"

docker images ansible/ansible
docker images quay.io/ansible/*
docker ps

for container in $(docker ps --format '{{.Image}} {{.ID}}' | grep -v '^drydock/' | sed 's/^.* //'); do
    docker rm -f "${container}" || true  # ignore errors
done

docker ps

if [ -d /home/shippable/cache/ ]; then
    ls -la /home/shippable/cache/
fi

command -v python
python -V

command -v pip
pip --version
pip list --disable-pip-version-check

export PATH="${PWD}/bin:${PATH}"
export PYTHONIOENCODING='utf-8'

if [ "${JOB_TRIGGERED_BY_NAME:-}" == "nightly-trigger" ]; then
    COVERAGE=yes
    COMPLETE=yes
fi

if [ -n "${COVERAGE:-}" ]; then
    # on-demand coverage reporting triggered by setting the COVERAGE environment variable to a non-empty value
    export COVERAGE="--coverage"
elif [[ "${COMMIT_MESSAGE}" =~ ci_coverage ]]; then
    # on-demand coverage reporting triggered by having 'ci_coverage' in the latest commit message
    export COVERAGE="--coverage"
else
    # on-demand coverage reporting disabled (default behavior, always-on coverage reporting remains enabled)
    export COVERAGE="--coverage-check"
fi

if [ -n "${COMPLETE:-}" ]; then
    # disable change detection triggered by setting the COMPLETE environment variable to a non-empty value
    export CHANGED=""
elif [[ "${COMMIT_MESSAGE}" =~ ci_complete ]]; then
    # disable change detection triggered by having 'ci_complete' in the latest commit message
    export CHANGED=""
else
    # enable change detection (default behavior)
    export CHANGED="--changed"
fi

if [ "${IS_PULL_REQUEST:-}" == "true" ]; then
    # run unstable tests which are targeted by focused changes on PRs
    export UNSTABLE="--allow-unstable-changed"
else
    # do not run unstable tests outside PRs
    export UNSTABLE=""
fi

virtualenv --python /usr/bin/python${PYTHON_VERSION} ~/ansible-venv
set +ux
. ~/ansible-venv/bin/activate
set -ux

# Install Ansible
pip install https://github.com/ansible/ansible/archive/${ANSIBLE_VERSION}.tar.gz --disable-pip-version-check

COLLECTION_DIR="${HOME}/.ansible/ansible_collections/"
TEST_DIR="${COLLECTION_DIR}/community/rabbitmq"
mkdir -p "${TEST_DIR}"
cp -aT "${SHIPPABLE_BUILD_DIR}" "${TEST_DIR}"
cd "${TEST_DIR}"

function cleanup
{
    if [ -d tests/output/coverage/ ]; then
        if find tests/output/coverage/ -mindepth 1 -name '.*' -prune -o -print -quit | grep -q .; then
            # for complete on-demand coverage generate a report for all files with no coverage on the "other" job so we only have one copy
            if [ "${COVERAGE}" == "--coverage" ] && [ "${CHANGED}" == "" ] && [ "${test}" == "sanity/1" ]; then
                stub="--stub"
            else
                stub=""
            fi

            # shellcheck disable=SC2086
            ansible-test coverage xml --color -v --requirements --group-by command --group-by version ${stub:+"$stub"}
            cp -a tests/output/reports/coverage=*.xml shippable/codecoverage/
        fi
    fi

    if [ -d  tests/output/junit/ ]; then
      cp -aT tests/output/junit/ shippable/testresults/
    fi

    if [ -d tests/output/data/ ]; then
      cp -a tests/output/data/ shippable/testresults/
    fi

    if [ -d  tests/output/bot/ ]; then
      cp -aT tests/output/bot/ shippable/testresults/
    fi
}

trap cleanup EXIT

if [[ "${COVERAGE:-}" == "--coverage" ]]; then
    timeout=60
else
    timeout=45
fi

# STAR: HACK install dependencies
(
#ansible.windows doesn't install from Galaxy
mkdir /tmp/collection_deps
git clone https://github.com/ansible-collections/ansible.windows.git /tmp/collection_deps/ansible.windows
cd /tmp/collection_deps/ansible.windows
ansible-galaxy collection build
ansible-galaxy collection install /tmp/collection_deps/ansible.windows/ansible-windows* -p "${COLLECTION_DIR}"
)


#ansible-galaxy collection install ansible.windows -p "${COLLECTION_DIR}"
ansible-galaxy collection install ansible.posix -p "${COLLECTION_DIR}"
ansible-galaxy collection install community.crypto -p "${COLLECTION_DIR}"
ansible-galaxy collection install ansible.netcommon -p "${COLLECTION_DIR}"

# unit tests
ansible-galaxy collection install community.kubernetes -p "${COLLECTION_DIR}"
ansible-galaxy collection install netbox.netbox -p "${COLLECTION_DIR}"
ansible-galaxy collection install netapp.ontap -p "${COLLECTION_DIR}"
ansible-galaxy collection install cisco.meraki -p "${COLLECTION_DIR}"
ansible-galaxy collection install fortinet.fortios -p "${COLLECTION_DIR}"
ansible-galaxy collection install junipernetworks.junos -p "${COLLECTION_DIR}"
ansible-galaxy collection install cisco.aci -p "${COLLECTION_DIR}"
ansible-galaxy collection install google.cloud -p "${COLLECTION_DIR}"
ansible-galaxy collection install community.kubernetes -p "${COLLECTION_DIR}"
ansible-galaxy collection install f5networks.f5_modules -p "${COLLECTION_DIR}"

# END: HACK

ansible-test env --dump --show --timeout "${timeout}" --color -v

"tests/utils/shippable/check_matrix.py"
"tests/utils/shippable/${script}.sh" "${test}"
