#!/usr/bin/env bash

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

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

WITH_KUBECONFIG=true
source $ROOT/hack/lib/vars.sh
source $ROOT/hack/lib/image.sh

PULUMI=${PULUMI:-"$ROOT/bin/pulumi"}
KUBECTL=${KUBECTL:-"kubectl"}
FREE_TIER_KUBECONFIG=${VAR_KUBECONFIG:-"$KUBECONFIG"}
FREE_TIER_CONTEXT=${VAR_CONTEXT:-"arn:aws:eks:us-east-1:385595570414:cluster/dev-us-east-1-f01"}

export PATH=$ROOT/bin:$PATH

setup_tidb_worker_environment() {

    if [ -d "${VAR_CACHE_DIR}/tidb-worker" ]; then
        return 0
    fi

    mkdir -p ${VAR_CACHE_DIR}
    cp -r $ROOT/cd/manifests/tidb-worker ${VAR_CACHE_DIR}

    echo "namespace: e2etesting-system-${cluster_name}-tidb-worker" >> \
        ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01/kustomization.yaml

    echo "  name: e2etesting-system-${cluster_name}-tidb-worker" >> \
        ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01/namespace.yaml

    echo "prefix: e2etesting-system-${cluster_name}-" >> \
        ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01/kustomizeconfig/nameprefixtransformer.yaml

    echo "prefix: e2etesting-system-${cluster_name}-" >> \
        ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01/kustomizeconfig/namespaceprefixtransformer.yaml

    echo "  name: ${image_name}" >> \
        ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01/kustomizeconfig/imagetransformer.yaml

    echo "  newTag: ${image_tag}" >> \
        ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01/kustomizeconfig/imagetransformer.yaml

    echo "            - -dsn=root:@tcp(serverless-cluster-tidb.tidb-serverless.svc:4000)/${database_name}?parseTime=true" >> \
        ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01/scaler.yaml

    # Rewrite the `dnsName` for the e2etesting system namespace.
    echo "    - '*.e2etesting-system-${cluster_name}-tidb-worker'" >> \
        ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01/cert.yaml
    echo "    - '*.e2etesting-system-${cluster_name}-tidb-worker.svc'" >> \
        ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01/cert.yaml
    echo "    - '*.e2etesting-system-${cluster_name}-tidb-worker.pod.cluster.local'" >> \
        ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01/cert.yaml
    echo "    - '*.e2etesting-system-${cluster_name}-tidb-worker.svc.cluster.local'" >> \
        ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01/cert.yaml
}


pulumi::deploy::install_tidb_worker() {
    local env=${1:-"mock-eks"}
    local cluster_name=${2:-"$(git config user.name)"}
    local version=${3:-""}
    local tidb_worker_ns=${4:-"e2etesting-system-$cluster_name-tidb-worker"}
    local suffix=$(echo $cluster_name | sed -e "s/-//g")
    local database_name=${5:-"tidb_worker_e2e_$suffix"}

    local FREE_TIER_STACK=organization/eks-freetier/dev-us-east-1-f01

    lib::image::get_image image tidb-worker $version
    local image_name=$(echo $image | awk -F ':' '{print $1}')
    local image_tag=$(echo $image | awk -F ':' '{print $2}')

    if [[ $env == "mock-eks" ]]; then
        $ROOT/hack/pulumi/mock-e2e-env.sh
    fi

    setup_tidb_worker_environment

    $KUBECTL kustomize ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01 | \
    $KUBECTL --kubeconfig=${FREE_TIER_KUBECONFIG} --context=${FREE_TIER_CONTEXT} \
        delete --ignore-not-found -f -

    $KUBECTL kustomize ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01 | \
        $KUBECTL --kubeconfig=${FREE_TIER_KUBECONFIG} --context=${FREE_TIER_CONTEXT} \
        apply -f -
}

pulumi::deploy::uninstall_tidb_worker() {
    local env=${1:-"mock-eks"}
    local cluster_name=${2:-"$(git config user.name)"}
    local image_name="fake-image-name"
    local image_tag="fake-image-tag"
    local suffix=$(echo $cluster_name | sed -e "s/-//g")
    local database_name="tidb_worker_e2e_$suffix"

    if [[ $env == "mock-eks" ]]; then
        export PULUMI_CONFIG_PASSPHRASE=
    fi

    setup_tidb_worker_environment

    $KUBECTL kustomize ${VAR_CACHE_DIR}/tidb-worker/envs/e2e-dev-us-east-1-f01 | \
    $KUBECTL --kubeconfig=${FREE_TIER_KUBECONFIG} --context=${FREE_TIER_CONTEXT} \
        delete --ignore-not-found -f -
}

# env: support "mock-eks" or "dev-eks" now
# cluster_name: kube_cluster_name used by manager, default is git user
# version: version of manager, default is HEAD
pulumi::deploy::install_manager() {
    local env=${1:-"mock-eks"}
    local cluster_name=${2:-"$(git config user.name)"}
    local tidb_pool_ns=${3:-"e2etesting-system-$cluster_name-tidb-pool"}
    local keyspace_pool_ns=${4:-"e2etesting-system-$cluster_name-keyspace-pool"}
    local version=${5:-""}
    local vip_tidb_pool_ns=${6:-"e2etesting-system-$cluster_name-vip-tidb-pool"}
    local import_jobs_ns=${7:-"e2etesting-system-$cluster_name-import-jobs"}
    local encrypt_keyspace_pool_ns=${8:-"e2etesting-system-$cluster_name-encrypt-keyspace-pool"}
    local tidb_worker_ns=${9:-"e2etesting-system-$cluster_name-tidb-worker"}

    local BASE_STACK=organization/eks/dev-base-us-west-2
    local INFRA_API_STACK=organization/infra-apiserver/dev
    local FREE_TIER_STACK=organization/eks-freetier/dev-us-east-1-f01

    if [[ $env == "mock-eks" ]]; then
        export PULUMI_CONFIG_PASSPHRASE=
        $PULUMI login --local
        $ROOT/hack/pulumi/mock-e2e-env.sh
        BASE_STACK=mock-base-eks-e2e
        INFRA_API_STACK=mock-infra-api-eks-e2e
        FREE_TIER_STACK=mock-free-tier-eks-e2e
    else
        $PULUMI login gs://tidbcloud-pulumi-state
    fi

    lib::image::get_image image manager $version
    lib::image::get_image meta_server_image meta-server $version

    mkdir -p ${VAR_CACHE_DIR}
    local config=${VAR_CACHE_DIR}/Pulumi.e2e-manager-${cluster_name}.yaml

    local meta_server_repo_path=/tmp/app-delivery
    local meta_server_repo_url=${meta_server_repo_path}/serverless-meta-store/envs/dev-us-east-1-f01

    if [[ -e "${meta_server_repo_path}" ]]; then
        rm -rf "${meta_server_repo_path}"
    fi
    git clone --depth=1 --filter=blob:none --no-checkout \
        "https://${VAR_GITHUB_TOKEN:+${VAR_GITHUB_TOKEN}@}github.com/tidbcloud/app-delivery.git" \
        "${meta_server_repo_path}"
    git -C "${meta_server_repo_path}" sparse-checkout init --cone
    git -C "${meta_server_repo_path}" sparse-checkout set serverless-meta-store
    git -C "${meta_server_repo_path}" checkout main

    cat <<EOF >${config}
config:
  manager:base-stack: ${BASE_STACK}
  manager:infra-api-stack: ${INFRA_API_STACK}
  manager:free-tier-stacks:
  - '${FREE_TIER_STACK}:${cluster_name}'
  manager:image: ${image}
  manager:namespace: e2etesting-system
  manager:name-suffix: -${cluster_name}
  manager:namespace-annotations:
    testing.tidbcloud.com/email: $(git config user.email)
    testing.tidbcloud.com/username: $(git config user.name)

  manager:keyspace-pool-ns: ${keyspace_pool_ns}
  manager:keyspace-pool-tidb-image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/tidb:20251222-fa3be73180bf77d8a1bd3d732d00d31a2d931e69
  manager:encrypt-keyspace-pool-ns: ${encrypt_keyspace_pool_ns}
  manager:keyspace-pool-size: 7
  manager:encrypt-keyspace-pool-size: 2
  manager:tidb-pool-ns: ${tidb_pool_ns}
  manager:o11y-disabled: true
  manager:zr-evicter-disabled: true
  manager:serverless-lightning-image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/tidb:lightning-20251222-fa3be73180bf77d8a1bd3d732d00d31a2d931e69
  manager:import-jobs-ns: ${import_jobs_ns}
  manager:tidb-worker-ns: ${tidb_worker_ns}
  manager:min-pool-replicas: 3
  manager:max-pool-replicas: 5
  manager:group-selector: tidb-xxl,tidb-od-xxl
  manager:tidb-version: v7.5.2
  manager:tidb-image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/tidb:20251222-fa3be73180bf77d8a1bd3d732d00d31a2d931e69
  manager:tidb-max-replicas: 3
  manager:tidb-resources: |
    limits:
      cpu: "2"
      memory: 512Mi
    requests:
      cpu: 50m
      memory: 128Mi
  manager:vip-tidb-pool-ns: ${vip_tidb_pool_ns}
  manager:vip-min-pool-replicas: 2
  manager:vip-max-pool-replicas: 3
  manager:vip-node-group-selector: tidb-xxl,tidb-od-xxl
  manager:vip-tidb-version: v7.5.2
  manager:vip-tidb-image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/tidb:20251222-fa3be73180bf77d8a1bd3d732d00d31a2d931e69
  manager:vip-tidb-max-replicas: 10
  # manager:vip-tidb-autoscaling: true
  manager:vip-tidb-priority: 100
  manager:vip-tidb-resources: |
    limits:
      cpu: "2"
      memory: 512Mi
    requests:
      cpu: 50m
      memory: 128Mi
  manager:export-job-ns: export-job
  manager:export-job-cm: export-job-template
  manager:dumpling-image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/tidb:dumpling-20251222-fa3be73180bf77d8a1bd3d732d00d31a2d931e69
  manager:export-debug-mode: true
  manager:export-account: export-sa
  manager:export-enable: true
  manager:audit-log-encrypt-key-ciphertext: AQICAHiOfjc6PWk9C7SYhRM1RS5cV7WyELBNK72n/Zu8xqOM2gHs9khFXNGYq8QTZn9t0LUhAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMTyVoeFMeacCJMK0CAgEQgDv6KUsoyDZfZYmkcV2izY+m2JK9l0oVDfUhI1L+ahJideQBFRT3iOsTvwB9SzNAXBM0T5zj/dZPQw+IOA==
  manager:audit-log-kms-alias-arn: arn:aws:kms:us-east-1:385595570414:alias/dev-us-east-1-f01-key
  manager:enable-infra-mysql-client: true
  manager:enable-double-write: false
  manager:meta-server-repo-url: ${meta_server_repo_url}
  manager:meta-server-image: ${meta_server_image}
EOF

    $PULUMI stack select e2e-manager-${cluster_name} \
        --create \
        -C $ROOT/cd/projects/manager

    $PULUMI up \
        --stack e2e-manager-${cluster_name} \
        --yes \
        --refresh \
        --config-file ${config} \
        -C $ROOT/cd/projects/manager
}

pulumi::deploy::uninstall_manager() {
    local env=${1:-"mock-eks"}
    local cluster_name=${2:-"$(git config user.name)"}

    if [[ $env == "mock-eks" ]]; then
        export PULUMI_CONFIG_PASSPHRASE=
        $PULUMI login --local
    else
        $PULUMI login gs://tidbcloud-pulumi-state
    fi

    if $PULUMI stack ls -C $ROOT/cd/projects/manager | grep e2e-manager-${cluster_name}; then
        local config=${VAR_CACHE_DIR}/Pulumi.e2e-manager-${cluster_name}.yaml
        $PULUMI destroy \
            --stack e2e-manager-${cluster_name} \
            --yes \
            --refresh \
            --config-file ${config} \
            -C $ROOT/cd/projects/manager

        $PULUMI stack rm e2e-manager-${cluster_name} \
            --yes \
            -C $ROOT/cd/projects/manager
    fi
}

pulumi::deploy::install_gateway() {
    local env=${1:-"mock-eks"}
    local cluster_name=${2:-"$(git config user.name)"}
    local version=${3:-""}

    local BASE_STACK=organization/eks/dev-base-us-west-2
    local INFRA_API_STACK=organization/infra-apiserver/dev
    local FREE_TIER_STACK=organization/eks-freetier/dev-us-east-1-f01

    if [[ $env == "mock-eks" ]]; then
        export PULUMI_CONFIG_PASSPHRASE=
        $PULUMI login --local
        $ROOT/hack/pulumi/mock-e2e-env.sh
        BASE_STACK=mock-base-eks-e2e
        INFRA_API_STACK=mock-infra-api-eks-e2e
        FREE_TIER_STACK=mock-free-tier-eks-e2e
    else
        $PULUMI login gs://tidbcloud-pulumi-state
    fi

    lib::image::get_image image tidb-gateway $version

    mkdir -p ${VAR_CACHE_DIR}
    local config=${VAR_CACHE_DIR}/Pulumi.e2e-gateway-${cluster_name}.yaml
    cat <<EOF >${config}
config:
  aws:region: us-east-1
  tidb-gateway:free-tier-stacks:
  - '${FREE_TIER_STACK}:${cluster_name}'
  tidb-gateway:image: ${image}
  tidb-gateway:namespace: e2etesting-system
  tidb-gateway:name-suffix: -${cluster_name}
  tidb-gateway:public-replicas: 1
  tidb-gateway:privatelink-replicas: 1
  tidb-gateway:subnet-name: dev-us-east-1-f01-vpc-public-0
  tidb-gateway:public-hosted-zone-domain: shared.aws.tidbcloud.com
  tidb-gateway:public-hosted-zone-id: Z329W86VRKILYT
  tidb-gateway:enable-infra-mysql-client: true
  tidb-gateway:haproxy-replicas: 1
  tidb-gateway:graceful-close-connections-timeout: 10m
  tidb-gateway:termination-grace-period-seconds: 300
  tidb-gateway:enable-haproxy-ingress: true
  tidb-gateway:enable-haproxy-ingress-public: true
  tidb-gateway:enable-haproxy-ingress-zr: true
  tidb-gateway:haproxy-image-repository: "385595570414.dkr.ecr.us-east-1.amazonaws.com/dbaas/nightly/haproxy-ingress-controller"
  tidb-gateway:haproxy-image-tag: "acf67c933799cad49c5d278cf631aa7d1f0d290c"
EOF

    $PULUMI stack select e2e-gateway-${cluster_name} \
        --create \
        -C $ROOT/cd/projects/tidb-gateway

    $PULUMI up \
        --stack e2e-gateway-${cluster_name} \
        --yes \
        --refresh \
        --config-file ${config} \
        -C $ROOT/cd/projects/tidb-gateway
}

pulumi::deploy::uninstall_gateway() {
    local env=${1:-"mock-eks"}
    local cluster_name=${2:-"$(git config user.name)"}

    if [[ $env == "mock-eks" ]]; then
        export PULUMI_CONFIG_PASSPHRASE=
        $PULUMI login --local
    else
        $PULUMI login gs://tidbcloud-pulumi-state
    fi

    if $PULUMI stack ls -C $ROOT/cd/projects/tidb-gateway | grep e2e-gateway-${cluster_name}; then
        local config=${VAR_CACHE_DIR}/Pulumi.e2e-gateway-${cluster_name}.yaml
        $PULUMI destroy \
            --stack e2e-gateway-${cluster_name} \
            --yes \
            --refresh \
            --config-file ${config} \
            -C $ROOT/cd/projects/tidb-gateway

        $PULUMI stack rm e2e-gateway-${cluster_name} \
            --yes \
            -C $ROOT/cd/projects/tidb-gateway
    fi
}

pulumi::deploy::install_tidb_pool() {
    local env=${1:-"mock-eks"}
    local cluster_name=${2:-"$(git config user.name)"}
    local tidb_pool_ns=${3:-"e2etesting-system-$cluster_name-tidb-pool"}
    local vip_tidb_pool_ns=${4:-"e2etesting-system-$cluster_name-vip-tidb-pool"}

    local BASE_STACK=organization/eks/dev-base-us-west-2
    local INFRA_API_STACK=organization/infra-apiserver/dev
    local FREE_TIER_STACK=organization/eks-freetier/dev-us-east-1-f01

    if [[ $env == "mock-eks" ]]; then
        export PULUMI_CONFIG_PASSPHRASE=
        $PULUMI login --local
        $ROOT/hack/pulumi/mock-e2e-env.sh
        BASE_STACK=mock-base-eks-e2e
        INFRA_API_STACK=mock-infra-api-eks-e2e
        FREE_TIER_STACK=mock-free-tier-eks-e2e
    else
        $PULUMI login gs://tidbcloud-pulumi-state
    fi

    mkdir -p ${VAR_CACHE_DIR}
    local config=${VAR_CACHE_DIR}/Pulumi.e2e-tidb-pool-${cluster_name}.yaml
    cat <<EOF >${config}
config:
  tidb-pool:e2eEnv: true
  tidb-pool:free-tier-stacks:
    - '${FREE_TIER_STACK}:${cluster_name}'
  tidb-pool:pools:
    - name: default
      namespace: ${tidb_pool_ns}
      image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/tidb:32b4dd0efced3a0aef5fbad9944ec7d27b8e9970
    - name: vip
      namespace: ${vip_tidb_pool_ns}
      priority: 100
      image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/tidb:32b4dd0efced3a0aef5fbad9944ec7d27b8e9970
EOF

    $PULUMI stack select e2e-tidb-pool-${cluster_name} \
        --create \
        -C $ROOT/cd/projects/tidb-pool

    $PULUMI up \
        --refresh \
        --stack e2e-tidb-pool-${cluster_name} \
        --yes \
        --config-file ${config} \
        -C $ROOT/cd/projects/tidb-pool
}

pulumi::deploy::uninstall_tidb_pool() {
    local env=${1:-"mock-eks"}
    local cluster_name=${2:-"$(git config user.name)"}

    if [[ $env == "mock-eks" ]]; then
        export PULUMI_CONFIG_PASSPHRASE=
        $PULUMI login --local
    else
        $PULUMI login gs://tidbcloud-pulumi-state
    fi

    if $PULUMI stack ls -C $ROOT/cd/projects/tidb-pool | grep e2e-tidb-pool-${cluster_name}; then
        local config=${VAR_CACHE_DIR}/Pulumi.e2e-tidb-pool-${cluster_name}.yaml
        $PULUMI destroy \
            --stack e2e-tidb-pool-${cluster_name} \
            --yes \
            --refresh \
            --config-file ${config} \
            -C $ROOT/cd/projects/tidb-pool

        $PULUMI stack rm e2e-tidb-pool-${cluster_name} \
            --yes \
            -C $ROOT/cd/projects/tidb-pool
    fi
}

ACTION=${1:-"install_manager"}
shift

case ${ACTION} in
install_manager)
    pulumi::deploy::install_manager ${@}
    ;;
uninstall_manager)
    pulumi::deploy::uninstall_manager ${@}
    ;;
install_gateway)
    pulumi::deploy::install_gateway ${@}
    ;;
uninstall_gateway)
    pulumi::deploy::uninstall_gateway ${@}
    ;;
install_tidb_worker)
    pulumi::deploy::install_tidb_worker ${@}
    ;;
uninstall_tidb_worker)
    pulumi::deploy::uninstall_tidb_worker ${@}
    ;;
install_tidb_pool)
    pulumi::deploy::install_tidb_pool ${@}
    ;;
uninstall_tidb_pool)
    pulumi::deploy::uninstall_tidb_pool ${@}
    ;;
*)
    echo "$(basename ${0}):usage: [ACTION] [ARGS]"
    echo "invalid action $ACTION"
    exit 1
    ;;
esac
