#!/bin/bash

set -e

# Optional: Import test library
source dev-container-features-test-lib

FAILED=()

echoStderr()
{
    echo "$@" 1>&2
}

check-version-ge() {
    LABEL=$1
    CURRENT_VERSION=$2
    REQUIRED_VERSION=$3
    shift
    echo -e "\n🧪 Testing $LABEL: '$CURRENT_VERSION' is >= '$REQUIRED_VERSION'"
    local GREATER_VERSION=$((echo ${CURRENT_VERSION}; echo ${REQUIRED_VERSION}) | sort -V | tail -1)
    if [ "${CURRENT_VERSION}" == "${GREATER_VERSION}" ]; then
        echo "✅  Passed!"
        return 0
    else
        echoStderr "❌ $LABEL check failed."
        FAILED+=("$LABEL")
        return 1
    fi
}

checkPythonPackageVersion()
{
    PACKAGE=$1
    REQUIRED_VERSION=$2

    current_version=$(python -c "import importlib.metadata; print(importlib.metadata.version('${PACKAGE}'))")
    check-version-ge "${PACKAGE}-requirement" "${current_version}" "${REQUIRED_VERSION}"
}

checkPythonPackageVersion "setuptools" "65.5.1"

# Check that tools can execute - make sure something didn't get messed up in this scenario
check "autopep8" autopep8 --version
check "black" black --version
check "yapf" yapf --version
check "bandit" bandit --version
check "flake8" flake8 --version
check "mypy" mypy --version
check "pycodestyle" pycodestyle --version
check "pydocstyle" pydocstyle --version
check "pylint" pylint --version
check "pytest" pytest --version
check "setuptools" pip list | grep setuptools

# Check paths in settings
check "which autopep8" bash -c "which autopep8 | grep /usr/local/py-utils/bin/autopep8"
check "which black" bash -c "which black | grep /usr/local/py-utils/bin/black"
check "which yapf" bash -c "which yapf | grep /usr/local/py-utils/bin/yapf"
check "which bandit" bash -c "which bandit | grep /usr/local/py-utils/bin/bandit"
check "which flake8" bash -c "which flake8 | grep /usr/local/py-utils/bin/flake8"
check "which mypy" bash -c "which mypy | grep /usr/local/py-utils/bin/mypy"
check "which pycodestyle" bash -c "which pycodestyle | grep /usr/local/py-utils/bin/pycodestyle"
check "which pydocstyle" bash -c "which pydocstyle | grep /usr/local/py-utils/bin/pydocstyle"
check "which pylint" bash -c "which pylint | grep /usr/local/py-utils/bin/pylint"
check "which pytest" bash -c "which pytest | grep /usr/local/py-utils/bin/pytest"

checkVulnerableFile_OR_DIR()
{
    for arg in "$@"; do
        if [[ -e $arg ]]; then
            echo -e "\n✅ Vulnerable:- ${arg} - exists in v3.11 as Vulnerability Patching has been skipped."
        else
            echo -e "\n❌ Vulnerable:- ${arg} - don't exist in v3.11 as Vulnerability Patching has not been skipped."
        fi
    done
}

# print setuptools
check "Show All Files/Folders which include setuptools" bash -c 'find / -name "*setuptools*"'

# only for 3.11
checkVulnerableFile_OR_DIR "/usr/local/py-utils/shared/lib/python3.11/site-packages/setuptools-65.5.0.dist-info" "/usr/local/lib/python3.11/ensurepip/_bundled/setuptools-65.5.0-py3-none-any.whl"

# Function to check if a package is installed
checkPackageInstalled() {
    if python -c "import $1" &>/dev/null; then
        echo -e "\n✅ Passed! \n$1 is installed"
    else
        echo -e "$1 is NOT installed\n"
        echoStderr "❌ check failed."
    fi
}

# Function to install a package using pip
installPackage() {
    python3 -m pip install "$1"
}

checkPipWorkingCorrectly() {
    echo -e "\n🧪 Testing whether pip install works fine \n"
    # List of packages to install via pip
    packages=("numpy" "requests" "matplotlib")
    # Install packages and check if installation was successful
    for package in "${packages[@]}"; do
        echo -e "\n🧪 Testing pip install $package\n"
        installPackage "$package"
        checkPackageInstalled "$package"
    done
}

checkPipWorkingCorrectly

# Report result
reportResults
