# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

if (NOT (ENABLE_ALL OR ENABLE_PYTHON_SCRIPTING))
    return()
endif()

set(MINIFI_VERSION_STR ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH})

function(ADD_DOCKER_TARGET_FROM_CENTOS BASE_IMAGE TAG_PREFIX INSTALL_PACKAGE_CMD)
    add_custom_target(
            ${TAG_PREFIX}_docker_from_centos_build
            COMMAND DOCKER_BUILDKIT=1 docker build
            --build-arg MINIFI_VERSION=${MINIFI_VERSION_STR}
            --build-arg BASE_IMAGE=${BASE_IMAGE}
            --build-arg ARCHIVE_LOCATION=nifi-minifi-cpp-${MINIFI_VERSION_STR}-bin-centos.tar.gz
            --build-arg INSTALL_PACKAGE_CMD=${INSTALL_PACKAGE_CMD}
            -t apacheminificpp:${TAG_PREFIX}-${MINIFI_VERSION_STR}
            -f ${CMAKE_SOURCE_DIR}/docker/python-verify/installed.Dockerfile
            ${CMAKE_BINARY_DIR})
endfunction()

function(ADD_DOCKER_VERIFY_PYTHON TAG_PREFIX HAS_MODULES)
    if (HAS_MODULES)
        add_custom_target(
                docker-verify-python-${TAG_PREFIX}
                COMMAND ${CMAKE_SOURCE_DIR}/docker/DockerVerify.sh --image-tag-prefix ${TAG_PREFIX} ${MINIFI_VERSION_STR} ENABLE_PYTHON_SCRIPTING)
    else()
        add_custom_target(
                docker-verify-python-${TAG_PREFIX}
                COMMAND ${CMAKE_SOURCE_DIR}/docker/DockerVerify.sh --image-tag-prefix ${TAG_PREFIX} ${MINIFI_VERSION_STR} ENABLE_PYTHON_SCRIPTING --tags_to_exclude NEEDS_NUMPY)
    endif()
endfunction()

function(ADD_CONDA_TO_DOCKER TAG_PREFIX)
    add_custom_target(
            conda_${TAG_PREFIX}_docker_from_centos_build
            COMMAND DOCKER_BUILDKIT=1 docker build
            --build-arg BASE_IMAGE=apacheminificpp:${TAG_PREFIX}-${MINIFI_VERSION_STR}
            -t apacheminificpp:conda_${TAG_PREFIX}-${MINIFI_VERSION_STR}
            -f ${CMAKE_SOURCE_DIR}/docker/python-verify/conda.Dockerfile
            ${CMAKE_BINARY_DIR})
endfunction()

function(ADD_VENV_TO_DOCKER TAG_PREFIX)
    add_custom_target(
            venv_${TAG_PREFIX}_docker_from_centos_build
            COMMAND DOCKER_BUILDKIT=1 docker build
            --build-arg BASE_IMAGE=apacheminificpp:${TAG_PREFIX}-${MINIFI_VERSION_STR}
            -t apacheminificpp:venv_${TAG_PREFIX}-${MINIFI_VERSION_STR}
            -f ${CMAKE_SOURCE_DIR}/docker/python-verify/venv.Dockerfile
            ${CMAKE_BINARY_DIR})
endfunction()


ADD_DOCKER_TARGET_FROM_CENTOS(debian:bullseye patched_bullseye "apt update \\&\\& apt install -y patchelf libpython3-dev python3-venv \\&\\& patchelf /opt/minifi/minifi-current/extensions/libminifi-python-script-extension.so --replace-needed libpython3.so libpython3.9.so")
ADD_DOCKER_TARGET_FROM_CENTOS(ubuntu:jammy patched_jammy "apt update \\&\\& apt install -y patchelf libpython3.10-dev python3.10-venv \\&\\& patchelf /opt/minifi/minifi-current/extensions/libminifi-python-script-extension.so --replace-needed libpython3.so libpython3.10.so.1.0")
ADD_DOCKER_TARGET_FROM_CENTOS(rockylinux:8 rocky8 "yum install -y python3-libs")
ADD_DOCKER_TARGET_FROM_CENTOS(rockylinux:9 rocky9 "yum install -y python3-libs")
ADD_DOCKER_TARGET_FROM_CENTOS(ubuntu:jammy jammy "apt update \\&\\& apt install -y wget")
ADD_CONDA_TO_DOCKER(jammy)
ADD_VENV_TO_DOCKER(rocky9)

if (EXISTS ${CMAKE_SOURCE_DIR}/docker/test/integration/features)
    ADD_DOCKER_VERIFY_PYTHON(rocky8 FALSE)
    ADD_DOCKER_VERIFY_PYTHON(rocky9 FALSE)
    ADD_DOCKER_VERIFY_PYTHON(patched_jammy FALSE)
    ADD_DOCKER_VERIFY_PYTHON(patched_bullseye FALSE)
    ADD_DOCKER_VERIFY_PYTHON(conda_jammy TRUE)
    ADD_DOCKER_VERIFY_PYTHON(venv_rocky9 TRUE)
endif()
