#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail

ROOT=$(cd $(dirname "${BASH_SOURCE[0]}")/../../../..; pwd -P)

source $ROOT/hack/lib/vars.sh
source $ROOT/hack/lib/image.sh

PULUMI=${PULUMI:-"$ROOT/bin/pulumi"}

ONLINE_DEV_BASE_STACK=sre-bot/eks/dev-base-us-west-2
ONLINE_DEV_INFRA_API_STACK=sre-bot/infra-apiserver/dev
ONLINE_DEV_EKS_SHARED_TIER_STACK=sre-bot/eks-sharedtier/dev-us-east-1-s01
ONLINE_DEV_GKE_SHARED_TIER_STACK=sre-bot/gke-sharedtier/dev-us-east1-s01
MOCK_BASE_STACK=mock-base
MOCK_INFRA_API_STACK=mock-infra-api
MOCK_EKS_SHARED_TIER_STACK=mock-shared-tier-eks
MOCK_GKE_SHARED_TIER_STACK=mock-shared-tier-gke


lib::pulumi::e2e::config::get_manager_config_path() {
    declare -n _config=$1

    local env=${2:-"eks"}
    local marker=${3:-"$(git config user.name)"}

    _config="${VAR_CACHE_DIR}/config/manager/Pulumi.${env}-${marker}.yaml"
}


# type:
# - cloud: cluster info is from https://api.pulumi.com
# - local: cluster info is mocked by pulumi::e2e::mock.sh
# env:
# - eks: generate manager config for eks
# - gke: generate manager config for gke
# marker: marker is identity of manager for e2e, it's used to diff with another manager for e2e
# version: manager version, default is HEAD
lib::pulumi::e2e::config::gen_manager_config() {
    local type=${1:-"local"}
    local env=${2:-"eks"}
    local marker=${3:-"$(git config user.name)"}
    local version=${4:-""}

    lib::pulumi::e2e::config::get_manager_config_path config $env $marker

    mkdir -p $(dirname $config)

    local base_stack;
    local infra_api_stack;
    local shared_tier_stack;

    case $type in
    cloud)
        base_stack=$ONLINE_DEV_BASE_STACK
        infra_api_stack=$ONLINE_DEV_INFRA_API_STACK
        case $env in
        eks)
            shared_tier_stack=$ONLINE_DEV_EKS_SHARED_TIER_STACK
            ;;
        gke)
            shared_tier_stack=$ONLINE_DEV_GKE_SHARED_TIER_STACK
            ;;
        *)
            echo "unknown env ${env} for pulumi::e2e::config::gen_manager_config"
            exit -1
            ;;
        esac
        ;;
    local)
        base_stack=$MOCK_BASE_STACK
        infra_api_stack=$MOCK_INFRA_API_STACK
        case $env in
        eks)
            shared_tier_stack=$MOCK_EKS_SHARED_TIER_STACK
            ;;
        gke)
            shared_tier_stack=$MOCK_GKE_SHARED_TIER_STACK
            ;;
        *)
            echo "unknown env ${env} for pulumi::e2e::config::gen_manager_config"
            exit -1
            ;;
        esac
        ;;
    *)
        echo "unknown type ${type} for pulumi::e2e::config::gen_manager_config"
        exit -1
        ;;
    esac


    lib::image::get_image image manager $version

    cat << EOF > ${config}
config:
  shared-manager:base-stack: ${base_stack}
  shared-manager:infra-api-stack: ${infra_api_stack}
  shared-manager:shared-tier-stacks:
  - '${shared_tier_stack}:${env}-${marker}'
  shared-manager:image: ${image}
  shared-manager:namespace: e2etesting-system
  shared-manager:name-suffix: -${marker}
  shared-manager:namespace-annotations: {}
  shared-manager:config-service-url: http://config-service-mock.tidb-admin:8080
  shared-manager:evict-pod-duration: 15s
EOF
}
