#!/bin/bash

source /var/onap/functions

policy_src_folder=$git_src_folder/policy
policy_repos=("policy/api" "policy/common" "policy/docker" \
"policy/drools-applications" "policy/drools-pdp" "policy/engine" \
"policy/gui" "policy/pap" "policy/pdp")

# clone_all_policy_repos() - Function that clones Policy source repo.
function clone_all_policy_repos {
    for repo in ${policy_repos[@]}; do
        clone_repo $repo $policy_src_folder${repo#*policy}
    done
}

# compile_all_policy_repos() - Function that compiles Policy source repo.
function compile_all_policy_repos {
    for repo in ${policy_repos[@]}; do
        compile_src $policy_src_folder${repo#*policy}
    done
}

# _build_policy_images() - Function that build Policy docker images from source code
function _build_policy_images {
    compile_src $policy_src_folder/docker
    pushd $policy_src_folder/docker
    install_maven
    mvn prepare-package
    cp -r target/policy-pe/* policy-pe/
    cp -r target/policy-drools/* policy-drools
    install_docker
    bash docker_verify.sh
    popd
}

# get_policy_images() - Function that retrieves Policy docker images
function get_policy_images {
    if [[ "$build_image" == "True" ]]; then
        _build_policy_images
    else
        pull_onap_image policy/policy-db onap/policy/policy-db:latest
        pull_onap_image policy/policy-pe onap/policy/policy-pe:latest
        pull_onap_image policy/policy-drools onap/policy/policy-drools:latest
        pull_onap_image policy/policy-nexus onap/policy/policy-nexus:latest
    fi
}

# install_policy() - Function that clones and installs the Policy services from source code
function install_policy {
    pushd $policy_src_folder/docker
    chmod +x config/drools/drools-tweaks.sh
    echo $IP_ADDRESS > config/pe/ip_addr.txt
    install_docker_compose
    /opt/docker/docker-compose up -d
    popd
}

# init_policy() - Function that initialize Policy services
function init_policy {
    if [[ "$clone_repo" == "True" ]]; then
        clone_all_policy_repos
        if [[ "$compile_repo" == "True" ]]; then
            compile_all_policy_repos
        fi
    fi

    if [[ "$skip_get_images" == "False" ]]; then
        get_policy_images
        if [[ "$skip_install" == "False" ]]; then
            install_policy
        fi
    fi
}
