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

### 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 "${BROKER_NAMESPACE}" \
             submariner-latest/submariner-k8s-broker \
             --create-namespace \
             --kube-context "${cluster}" \
             --namespace "${BROKER_NAMESPACE}" \
             ${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 "${BROKER_NAMESPACE}" get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='${BROKER_CLIENT_SA}')].data['ca\.crt']}")
    submariner_broker_token=$(kubectl -n "${BROKER_NAMESPACE}" get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='${BROKER_CLIENT_SA}')].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-operator -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-operator \
        submariner-latest/submariner-operator \
        --create-namespace \
        --namespace "${SUBM_NS}" \
        --set ipsec.psk="${IPSEC_PSK}" \
        --set broker.server="${submariner_broker_url}" \
        --set broker.token="${submariner_broker_token}" \
        --set broker.namespace="${BROKER_NAMESPACE}" \
        --set broker.ca="${submariner_broker_ca}" \
        --set broker.globalnet="${globalnet}" \
        --set submariner.serviceDiscovery="${service_discovery}" \
        --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 serviceAccounts.lighthouseAgent.create="${service_discovery}" \
        --set serviceAccounts.lighthouseCoreDns.create="${service_discovery}" \
        --set submariner.natEnabled="false" \
        --set operator.image.repository="localhost:5000/submariner-operator" \
        --set operator.image.tag="local" \
        --set operator.image.pullPolicy="IfNotPresent" \
        --set submariner.images.repository="localhost:5000" \
        --set submariner.images.tag="local" \
        --set brokercrds.create="${crd_create}" \
        ${deploytool_submariner_args}
}

function install_subm_all_clusters() {
    run_subm_clusters helm_install_subm
}
