#!/usr/bin/env bash
set -euo pipefail

if [ -z ${ENABLE_GIT_PUSH+x} ]; then
  ENABLE_GIT_PUSH=false
fi

echo "codegen running ENABLE_GIT_PUSH: ${ENABLE_GIT_PUSH}"

bandwidth() {
  GENERATED_FILE="pkg/providers/instancetype/zz_generated.bandwidth.go"
  NO_UPDATE=''
  SUBJECT="Bandwidth"

  go run hack/code/bandwidth_gen.go -- "${GENERATED_FILE}"

  GIT_DIFF=$(git diff --stat "${GENERATED_FILE}")
  checkForUpdates "${GIT_DIFF}" "${NO_UPDATE}" "${SUBJECT}" "${GENERATED_FILE}"
}

pricing() {
  GENERATED_FILE="pkg/providers/pricing/zz_generated.pricing.go"
  NO_UPDATE=$' pkg/providers/pricing/zz_generated.pricing.go | 4 ++--\n 1 file changed, 2 insertions(+), 2 deletions(-)'
  SUBJECT="Pricing"

  go run hack/code/prices_gen.go -- "${GENERATED_FILE}"

  GIT_DIFF=$(git diff --stat "${GENERATED_FILE}")
  checkForUpdates "${GIT_DIFF}" "${NO_UPDATE}" "${SUBJECT} beside timestamps since last update" "${GENERATED_FILE}"
}

vpcLimits() {
  GENERATED_FILE="pkg/providers/instancetype/zz_generated.vpclimits.go"
  NO_UPDATE=''
  SUBJECT="VPC Limits"

  go run hack/code/vpc_limits_gen.go -- \
    --url=https://raw.githubusercontent.com/aws/amazon-vpc-resource-controller-k8s/master/pkg/aws/vpc/limits.go \
    --output="${GENERATED_FILE}"

  GIT_DIFF=$(git diff --stat "${GENERATED_FILE}")
  checkForUpdates "${GIT_DIFF}" "${NO_UPDATE}" "${SUBJECT}" "${GENERATED_FILE}"
}

instanceTypeTestData() {
  GENERATED_FILE="pkg/fake/zz_generated.describe_instance_types.go"
  NO_UPDATE=''
  SUBJECT="Instance Type Test Data"

  go run hack/code/instancetype_testdata_gen.go --out-file ${GENERATED_FILE} \
    --instance-types t3.large,m5.large,m5.xlarge,p3.8xlarge,g4dn.8xlarge,c6g.large,inf1.2xlarge,inf1.6xlarge,trn1.2xlarge,m5.metal,dl1.24xlarge,m6idn.32xlarge,t4g.small,t4g.xlarge,t4g.medium

  GIT_DIFF=$(git diff --stat "${GENERATED_FILE}")
  checkForUpdates "${GIT_DIFF}" "${NO_UPDATE}" "${SUBJECT}" "${GENERATED_FILE}"
}

checkForUpdates() {
  GIT_DIFF=$1
  NO_UPDATE=$2
  SUBJECT=$3
  GENERATED_FILE=$4

  echo "Checking git diff for updates. ${GIT_DIFF}, ${NO_UPDATE}"
  if [[ "${GIT_DIFF}" == "${NO_UPDATE}" ]]; then
    noUpdates "${SUBJECT}"
    git checkout "${GENERATED_FILE}"
  else
    echo "true" >/tmp/codegen-updates
    git add "${GENERATED_FILE}"
    if [[ $ENABLE_GIT_PUSH == true ]]; then
      gitCommitAndPush "${SUBJECT}"
    fi
  fi
}

gitOpenAndPullBranch() {
  git fetch origin
  git checkout codegen || git checkout -b codegen || true
}

gitCommitAndPush() {
  UPDATE_SUBJECT=$1
  git commit -m "CodeGen updates from AWS API for ${UPDATE_SUBJECT}"
  git push --set-upstream origin codegen
}

noUpdates() {
  UPDATE_SUBJECT=$1
  echo "No updates from AWS API for ${UPDATE_SUBJECT}"
}

if [[ $ENABLE_GIT_PUSH == true ]]; then
  gitOpenAndPullBranch
fi

bandwidth
pricing
vpcLimits
instanceTypeTestData