#!/bin/bash

set -o xtrace

source /var/onap/functions

vnfsdk_src_folder=$git_src_folder/vnfsdk
vnfsdk_repos=("vnfsdk/compliance" "vnfsdk/functest" "vnfsdk/lctest" "vnfsdk/model" "vnfsdk/pkgtools" "vnfsdk/refrepo" "vnfsdk/validation")

# clone_all_vnfsdk_repos() - Function that clones vnfsdk source repo.
function clone_all_vnfsdk_repos {
    for repo in ${vnfsdk_repos[@]}; do
        clone_repo $repo $vnfsdk_src_folder${repo#*vnfsdk}
    done
}

# compile_all_vnfsdk_repos - Function that builds vnfsdk source repo
function compile_all_vnfsdk_repos {
    for repo in ${vnfsdk_repos[@]}; do
        compile_src $vnfsdk_src_folder${repo#*vnfsdk}
    done
}

# _build_vnfsdk_images() - Builds VNFSDK images from source code
function _build_vnfsdk_images {
    install_package unzip
    pushd $vnfsdk_src_folder/refrepo/vnfmarket-be/deployment/docker/docker-refrepo
    build_docker_image .
    popd
}

# get_vnfsdk_images - Function that clones vnfsdk Docker images
function get_vnfsdk_images {
    if [[ "$build_image" == "True" ]]; then
        # TODO(sshank): Has errors building.
        _build_vnfsdk_images
    else
        pull_docker_image refrepo:1.0-STAGING-latest
        pull_docker_image refrepo:latest
    fi
}

# install_vnfsdk - Function that installs vnfsdk Docker images
function install_vnfsdk {
    install_docker_compose
    pushd $vnfsdk_src_folder/refrepo/vnfmarket-be/deployment/install
    /opt/docker/docker-compose up -d
    popd
}

# init_vnfsdk() - Init VNFSDK services
function init_vnfsdk {
    if [[ "$clone_repo" == "True" ]]; then
        clone_all_vnfsdk_repos
        if [[ "$compile_repo" == "True" ]]; then
            compile_all_vnfsdk_repos
        fi
    fi

    if [[ "$skip_get_images" == "False" ]]; then
        get_vnfsdk_images
        if [[ "$skip_install" == "False" ]]; then
            install_vnfsdk
        fi
    fi
}
