#!/usr/bin/env bash
# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: MPL-2.0

set -uo pipefail

function usage {
  cat <<-'EOF'
Usage: ./equivalence-test.sh <command> [<args>] [<options>]

Description:
  This script will handle various commands related to the execution of the
  Terraform equivalence tests.

Commands:
  get_target_branch <version>
    get_target_branch returns the default target branch for a given Terraform
    version.

    target_branch=$(./equivalence-test.sh get_target_branch v1.4.3); target_branch=v1.4
    target_branch=$(./equivalence-test.sh get_target_branch 1.4.3); target_branch=v1.4

  download_equivalence_test_binary <version> <target> <os> <arch>
    download_equivalence_test_binary downloads the equivalence testing binary
    for a given version and places it at the target path.

    ./equivalence-test.sh download_equivalence_test_binary 0.3.0 ./bin/terraform-equivalence-testing linux amd64

  download_terraform_binary <version> <target> <os> <arch>
    download_terraform_binary downloads the terraform release binary for a given
    version and places it at the target path.

    ./equivalence-test.sh download_terraform_binary 1.4.3 ./bin/terraform linux amd64
EOF
}

function download_equivalence_test_binary {
  VERSION="${1:-}"
  TARGET="${2:-}"
  OS="${3:-}"
  ARCH="${4:-}"

  if [[ -z "$VERSION" || -z "$TARGET" || -z "$OS" || -z "$ARCH" ]]; then
    echo "missing at least one of [<version>, <target>, <os>, <arch>] arguments"
    usage
    exit 1
  fi

  curl \
    -H "Accept: application/vnd.github+json" \
    "https://api.github.com/repos/hashicorp/terraform-equivalence-testing/releases" > releases.json

  ASSET="terraform-equivalence-testing_v${VERSION}_${OS}_${ARCH}.zip"
  ASSET_ID=$(jq -r --arg VERSION "v$VERSION" --arg ASSET "$ASSET" '.[] | select(.name == $VERSION) | .assets[] | select(.name == $ASSET) | .id' releases.json)

  mkdir -p zip
  curl -L \
    -H "Accept: application/octet-stream" \
    "https://api.github.com/repos/hashicorp/terraform-equivalence-testing/releases/assets/$ASSET_ID" > "zip/$ASSET"

  mkdir -p bin
  unzip -p "zip/$ASSET" terraform-equivalence-testing > "$TARGET"
  chmod u+x "$TARGET"
  rm -r zip
  rm releases.json
}

function download_terraform_binary {
  VERSION="${1:-}"
  TARGET="${2:-}"
  OS="${3:-}"
  ARCH="${4:-}"

  if [[ -z "$VERSION" || -z "$TARGET" || -z "$OS" || -z "$ARCH" ]]; then
    echo "missing at least one of [<version>, <target>, <os>, <arch>] arguments"
    usage
    exit 1
  fi

  mkdir -p zip
  curl "https://releases.hashicorp.com/terraform/${VERSION}/terraform_${VERSION}_${OS}_${ARCH}.zip" > "zip/terraform.zip"

  mkdir -p bin
  unzip -p "zip/terraform.zip" terraform > "$TARGET"
  chmod u+x "$TARGET"
  rm -r zip
}

function get_target_branch {
  VERSION="${1:-}"

  if [ -z "$VERSION" ]; then
    echo "missing <version> argument"
    usage
    exit 1
  fi


  # Split off the build metadata part, if any
  # (we won't actually include it in our final version, and handle it only for
  # completeness against semver syntax.)
  IFS='+' read -ra VERSION BUILD_META <<< "$VERSION"

  # Separate out the prerelease part, if any
  IFS='-' read -r BASE_VERSION PRERELEASE <<< "$VERSION"

  # Separate out major, minor and patch versions.
  IFS='.' read -r MAJOR_VERSION MINOR_VERSION PATCH_VERSION <<< "$BASE_VERSION"

  if [[ "$PRERELEASE" == *"alpha"* ]]; then
    TARGET_BRANCH=main
  else
    if [[ $MAJOR_VERSION = v* ]]; then
      TARGET_BRANCH=${MAJOR_VERSION}.${MINOR_VERSION}
    else
      TARGET_BRANCH=v${MAJOR_VERSION}.${MINOR_VERSION}
    fi
  fi

  echo "$TARGET_BRANCH"
}

function main {
  case "$1" in
    get_target_branch)
      if [ "${#@}" != 2 ]; then
        echo "invalid number of arguments"
        usage
        exit 1
      fi

      get_target_branch "$2"

      ;;
    download_equivalence_test_binary)
      if [ "${#@}" != 5 ]; then
        echo "invalid number of arguments"
        usage
        exit 1
      fi

      download_equivalence_test_binary "$2" "$3" "$4" "$5"

      ;;
    download_terraform_binary)
      if [ "${#@}" != 5 ]; then
        echo "invalid number of arguments"
        usage
        exit 1
      fi

      download_terraform_binary "$2" "$3" "$4" "$5"

      ;;
    *)
      echo "unrecognized command $*"
      usage
      exit 1

      ;;
  esac
}

main "$@"
exit $?
