# shellcheck shell=bash
# shellcheck source=scripts/shared/lib/source_only
. "${BASH_SOURCE%/*}"/source_only

### Constants ###

readonly SUBMARINER_BROKER_NS=submariner-k8s-broker
readonly SUBMARINER_PSK=$(LC_CTYPE=C tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 64 | head -n 1)

### Functions ###

function deploytool_prereqs() {
    helm version
    helm repo add submariner-latest https://submariner-io.github.io/submariner-charts/charts
}

function setup_broker() {
    if kubectl get crd clusters.submariner.io > /dev/null 2>&1; then
        echo "Submariner CRDs already exist, skipping broker creation..."
    else
        echo "Installing submariner broker..."
        # shellcheck disable=SC2086 # Split on purpose
        helm install "${SUBMARINER_BROKER_NS}" \
             submariner-latest/submariner-k8s-broker \
             --create-namespace \
             --kube-context "${cluster}" \
             --namespace "${SUBMARINER_BROKER_NS}" \
             ${deploytool_broker_args}
    fi

    submariner_broker_url=$(kubectl -n default get endpoints kubernetes -o jsonpath="{.subsets[0].addresses[0].ip}:{.subsets[0].ports[?(@.name=='https')].port}")
    submariner_broker_ca=$(kubectl -n "${SUBMARINER_BROKER_NS}" get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='${SUBMARINER_BROKER_NS}-client')].data['ca\.crt']}")
    submariner_broker_token=$(kubectl -n "${SUBMARINER_BROKER_NS}" get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='${SUBMARINER_BROKER_NS}-client')].data.token}"|base64 --decode)
}

function helm_install_subm() {
    local crd_create=false
    [[ "${cluster}" = "${broker}" ]] || crd_create=true

    if kubectl wait --for=condition=Ready pods -l app=submariner-engine -n "${SUBM_NS}" --timeout=60s > /dev/null 2>&1; then
        echo "Submariner already installed, skipping installation..."
        return
    fi

    echo "Installing Submariner..."
    # shellcheck disable=SC2086 # Split on purpose
    helm --kube-context "${cluster}" install submariner \
        submariner-latest/submariner \
        --create-namespace \
        --namespace "${SUBM_NS}" \
        --set ipsec.psk="${SUBMARINER_PSK}" \
        --set broker.server="${submariner_broker_url}" \
        --set broker.token="${submariner_broker_token}" \
        --set broker.namespace="${SUBMARINER_BROKER_NS}" \
        --set broker.ca="${submariner_broker_ca}" \
        --set submariner.cableDriver="${cable_driver}" \
        --set submariner.clusterId="${cluster}" \
        --set submariner.clusterCidr="${cluster_CIDRs[$cluster]}" \
        --set submariner.serviceCidr="${service_CIDRs[$cluster]}" \
        --set submariner.globalCidr="${global_CIDRs[$cluster]}" \
        --set serviceAccounts.globalnet.create="${globalnet}" \
        --set submariner.natEnabled="false" \
        --set routeAgent.image.repository="localhost:5000/submariner-route-agent" \
        --set routeAgent.image.tag="local" \
        --set routeAgent.image.pullPolicy="IfNotPresent" \
        --set engine.image.repository="localhost:5000/submariner" \
        --set engine.image.tag="local" \
        --set engine.image.pullPolicy="IfNotPresent" \
        --set globalnet.image.repository="localhost:5000/submariner-globalnet" \
        --set globalnet.image.tag="local" \
        --set globalnet.image.pullPolicy="IfNotPresent" \
        --set crd.create="${crd_create}" \
        ${deploytool_submariner_args}
}


function install_subm_all_clusters() {
    run_subm_clusters helm_install_subm
}
