#!/usr/bin/env bash

remote_config=${CONFIG_PATH}
local_config=/tmp/base-config.yaml

bucket_name=${remote_config#s3://}
bucket_name=${bucket_name%%/*}
output_bucket_region=$(aws s3api get-bucket-location --bucket=$bucket_name --query="LocationConstraint" \
  --region=us-west-2 --output=text --no-cli-pager)
aws s3 cp "${remote_config}" "${local_config}" --region=$output_bucket_region

argocd_repo=tidbcloud/app-delivery
region=$(yq '.region' "${local_config}")
env=$(yq '.env' "${local_config}")
cloud=$(yq '.cloudProvider' "${local_config}")
cluster=$(yq '.k8s.name' "${local_config}")
jobId=$(yq '.jobId' "${local_config}")
output=$(yq '.outputPath' "${local_config}")
image_registry=$(yq '.imageRegistry' "${local_config}")

dnsName=$(yq '.jobOptions.regionalServer.dnsName' "${local_config}")
hostedZoneId=$(yq '.jobOptions.regionalServer.hostedZoneId' "${local_config}")
lbHostedZoneId=$(yq '.jobOptions.regionalServer.loadBalancerHostedZoneId' "${local_config}")

timeout=${JOB_TIMEOUT:=300} # 5min
interval=${JOB_CHECK_INTERVAL:=10}
start_time=$(date +%s)
kong_svc=kong-kong-proxy
while [[ $(($(date +%s) - $start_time)) -lt $timeout ]]; do
  hostname=$(kubectl -n kong get svc "${kong_svc}" -ojsonpath='{.status.loadBalancer.ingress[0].hostname}')
  if [[ -z "$hostname" ]]; then
    sleep "${interval}"
  else
    echo "AWS loadbalaner $hostname is ready"
    break
  fi
done
if [[ -z "$hostname" ]]; then
  echo "failed to get elb dns name"
  exit 1
fi

changeFile="/tmp/changes.json"
cat <<EOF > "${changeFile}"
{
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "${dnsName}",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "${lbHostedZoneId}",
          "DNSName": "${hostname}",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}
EOF

AWS_MAX_ATTEMPTS=100 aws route53 change-resource-record-sets \
  --hosted-zone-id ${hostedZoneId} \
  --change-batch "file://$changeFile"
if [[ $? -ne 0 ]];  then
  echo "failed to update dns record"
  exit 1
fi

while [[ $(($(date +%s) - $start_time)) -lt $timeout ]]; do
  nslookup "${dnsName}"
  if [[ $? -ne 0 ]];  then
    sleep "${interval}"
  else
    echo "$dnsName is ready"
    exit 0
  fi
done
exit 1 # DNS not ready