#!/usr/bin/env bash
# Copyright 2021 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

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

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

function ensure_dependencies() {
    if [ -z "$(which curl)" ]; then
        echo "Please install curl"
        exit 1
    fi

    if [ -z "$(which tfswitch)" ]; then
        echo "Please install tfswitch"
        exit 1
    fi
}

function check_terraform() {
  local path="${1}"

  if [ ! -d "${path}" ]; then
      echo "check_terraform: path '${path}' is not a directory (or does not exist)"
      return 1
  fi

  pushd "${path}" >/dev/null

  echo "# Installing terraform for path: ${path} ..."
  tfswitch

  echo "# Running terraform validate for path: ${path} ..."
  terraform init -backend=false
  terraform validate

  popd >/dev/null
}

function main() {
    local paths=("$@")
    local failures=()

    ensure_dependencies

    # if no paths specified, default to all paths that contain *.tf,
    # excluding modules/* since those are picked up by way of inclusion
    # in the rest of our terraform
    pushd "$REPO_ROOT"
    if [ "${#paths[@]}" == 0 ]; then
        mapfile -t paths < <(
          find . -name '*.tf' -print0 \
            | xargs -0 -n1 dirname \
            | sort \
            | uniq \
            | grep -v ^./infra/gcp/terraform/modules/
        )
    fi

    # verify all terraform paths
    for path in "${paths[@]}"; do
        echo "# Verifying terraform for path: ${path} ..."
        if ! check_terraform "${path}"; then
            failures+=("${path}")
        fi
    done

    # determine pass/fail
    result="passed"
    code=0
    if [ ${#failures[@]} != 0 ]; then
        result="failed"
        code=1
    fi

    # report
    echo "result: ${result}"
    echo "failures:"
    printf "%s\n" "${failures[@]/#/- }"
    exit "${code}"
}

main "$@"
