#!/usr/bin/env bash

# Copyright (c) 2021 Intel and/or its affiliates.
# 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.

set -exuo pipefail


function gather_nginx () {

    # Ensure stable NGINX archive is downloaded.
    #
    # Variables read:
    # - DOWNLOAD_DIR - Path to directory pybot takes the build to test from.
    # - NGINX_VER - Version number of Nginx.
    set -exuo pipefail
    pushd "${DOWNLOAD_DIR}" || die "Pushd failed."
    nginx_repo="http://nginx.org/download/"
    # Use downloaded packages with specific version
    echo "Downloading NGINX package of specific version from repo ..."
    # Downloading NGINX version based on what VPP is using. Currently
    # it is not easy way to detect from VPP version automatically.
    nginx_stable_ver="${NGINX_VER}".tar.gz

    if [[ ! -f "${nginx_stable_ver}" ]]; then
        wget -nv --no-check-certificate \
        "${nginx_repo}/${nginx_stable_ver}"  || {
            die "Failed to get NGINX package from: ${nginx_repo}."
        }
    fi
    popd || die "Popd failed."
}


function common_dirs () {

    # Set global variables, create some directories (without touching content).
    # This function assumes running in remote testbed. It might override other
    # functions if included from common.sh.

    # Arguments:
    # - ${1} - Version number of Nginx.
    # Variables set:
    # - BASH_FUNCTION_DIR - Path to existing directory this file is located in.
    # - CSIT_DIR - Path to CSIT framework.
    # - DOWNLOAD_DIR - Path to directory pybot takes the build to test from.
    # - NGINX_DIR - Path to NGINX framework.
    # - NGINX_VER - Version number of Nginx.
    # Functions called:
    # - die - Print to stderr and exit.

    set -exuo pipefail
    NGINX_VER="${1}"
    this_file=$(readlink -e "${BASH_SOURCE[0]}") || {
        die "Some error during locating of this source file."
    }
    BASH_FUNCTION_DIR=$(dirname "${this_file}") || {
        die "Some error during dirname call."
    }
    CSIT_DIR=$(readlink -e "/tmp/openvpp-testing") || {
        die "Readlink failed."
    }
    DOWNLOAD_DIR=$(readlink -f "${CSIT_DIR}/download_dir") || {
        die "Readlink failed."
    }
    mkdir -p "${CSIT_DIR}/${NGINX_VER}" || die "Mkdir failed."
    NGINX_DIR=$(readlink -e "${CSIT_DIR}/${NGINX_VER}") || {
        die "Readlink failed."
    }
}



function nginx_compile () {

    # Compile NGINX archive.
    #
    # Variables read:
    # - NGINX_DIR - Path to NGINX framework.
    # - CSIT_DIR - Path to CSIT framework.
    # - NGINX_INS_PATH - Path to NGINX install path.
    # Functions called:
    # - die - Print to stderr and exit.

    set -exuo pipefail
    NGINX_INS_PATH="${DOWNLOAD_DIR}/${NGINX_VER}"
    pushd "${NGINX_DIR}" || die "Pushd failed."

    # Set installation prefix.
    param="--prefix=${NGINX_INS_PATH} "
    # Set nginx binary pathname.
    param+="--sbin-path=${NGINX_INS_PATH}/sbin/nginx "
    # Set nginx.conf pathname.
    param+="--conf-path=${NGINX_INS_PATH}/conf/nginx.conf "
    # Enable ngx_http_stub_status_module.
    param+="--with-http_stub_status_module "
    # Force PCRE library usage.
    param+="--with-pcre "
    # Enable ngx_http_realip_module.
    param+="--with-http_realip_module "
    params=(${param})
    ./configure "${params[@]}" || die "Failed to configure NGINX!"
    make -j 16;make install || die "Failed to compile NGINX!"
}


function nginx_extract () {

    # Extract NGINX framework.
    #
    # Variables read:
    # - NGINX_DIR - Path to NGINX framework.
    # - CSIT_DIR - Path to CSIT framework.
    # - DOWNLOAD_DIR - Path to directory pybot takes the build to test from.
    # - NGINX_VER - Version number of Nginx.
    # Functions called:
    # - die - Print to stderr and exit.

    set -exuo pipefail

    pushd "${CSIT_DIR}" || die "Pushd failed."
    tar -xvf ${DOWNLOAD_DIR}/${NGINX_VER}.tar.gz --strip=1 \
          --directory "${NGINX_DIR}" || {
          die "Failed to extract NGINX!"
    }
}