#!/bin/bash

function provision_aws_help() {
  [[ -n "$1" ]] && echo_warning "$1"
  reset_colors
  cat << EOM
Usage:
  mas provision-aws [options]
Where ${COLOR_YELLOW}specified${TEXT_RESET} each option may also be defined by setting the appropriate environment variable.
When no options are specified on the command line, interactive-mode will be enabled by default.

AWS Credentials (Required):
  -a, --accesskeyid ${COLOR_YELLOW}AWS_ACCESS_KEY_ID${TEXT_RESET}           AWS ACCESS KEY ID
  -k, --secretkey ${COLOR_YELLOW}AWS_SECRET_ACCESS_KEY${TEXT_RESET}         AWS SECRET ACCESS KEY

Cluster Configuration (Required):
  -c, --cluster-name ${COLOR_YELLOW}CLUSTER_NAME${TEXT_RESET}               Name of the cluster to be provisioned
  -v, --ocp-version ${COLOR_YELLOW}OCP_VERSION${TEXT_RESET}                 OCP version to use (e.g 4.16_openshift)

IPI Configuration (Required):
  -r, --region-name ${COLOR_YELLOW}IPI_REGION${TEXT_RESET}                  Region of the cluster to be provisioned (e.g. us-east-1, us-east-2)
  -d, --domain-name ${COLOR_YELLOW}IPI_BASE_DOMAIN${TEXT_RESET}             Base Domain name (e.g. buyermas4aws.com)
  -f, --secret-file ${COLOR_YELLOW}IPI_PULL_SECRET_FILE${TEXT_RESET}        Location of the file containing your Redhat OpenShift pull secret

Single Node OpenShift (Optional)
  -s, --single-node ${COLOR_YELLOW}SNO_MODE${TEXT_RESET}                    SNO_MODE when 'true' indicates cluster must be configured with in a single node mode (e.g. 1 control plane replica, 1 mongodb replica, etc)

Other Commands:
      --no-confirm                              Provision the cluster without prompting for confirmation
  -h, --help                                    Show this help message
EOM
  [[ -n "$1" ]] && exit 1 || exit 0
}


# function provision_aws_noninteractive provides a non-interactive method to input all the environment variables at one shot.
function provision_aws_noninteractive() {
  while [[ $# -gt 0 ]]
  do
    key="$1"
    shift
    case $key in
      -a|--accesskeyid)
        export AWS_ACCESS_KEY_ID=$1 && shift
        ;;
      -k|--secretkey)
        export AWS_SECRET_ACCESS_KEY=$1 && shift
        ;;
      -c|--cluster-name)
        export CLUSTER_NAME=$1 && shift
        ;;
      -v|--ocp-version)
        export OCP_VERSION=$1 && shift
        ;;
      -r|--region-name)
        export IPI_REGION=$1 && shift
        ;;
      -d|--domain-name)
        export IPI_BASE_DOMAIN=$1 && shift
        ;;
      -s|--single-node)
        export SNO_MODE=$1 && shift
        ;;
      -f|--secret-file)
        export IPI_PULL_SECRET_FILE=$1 && shift
        ;;
      --no-confirm)
        export NO_CONFIRM=true
        ;;
      -h|--help)
        provision_aws_help
        ;;
      *)
        # unknown option
        echo -e "${COLOR_RED}Usage Error: Unsupported option \"${key}\"${TEXT_RESET}\n"
        provision_aws_help
        exit 1
        ;;
      esac
  done

  # Check all args have been set
  [[ -z "$AWS_ACCESS_KEY_ID" ]] && provision_aws_help "AWS_ACCESS_KEY_ID is not set"
  [[ -z "$AWS_SECRET_ACCESS_KEY" ]] && provision_aws_help "AWS_SECRET_ACCESS_KEY is not set"
  [[ -z "$CLUSTER_NAME" ]] && provision_aws_help "CLUSTER_NAME is not set"
  [[ -z "$OCP_VERSION" ]] && provision_aws_help "OCP_VERSION is not set"
  [[ -z "$IPI_REGION" ]] && provision_aws_help "IPI_REGION is not set"
  [[ -z "$IPI_BASE_DOMAIN" ]] && provision_aws_help "IPI_BASE_DOMAIN is not set"

  # Set SNO Vars in case SNO_MODE = true
  if [[ "$SNO_MODE" == "true" ]]; then
    set_sno_vars
  fi
}

# function set_default_vars sets default variables for a generic AWS provisioning.
function set_default_vars() {
  export IPI_CONFIG_DIR="${CLI_DIR}/masconfig"
  export IPI_PLATFORM=aws                # IPI_PLATFORM
  export CLUSTER_TYPE=ipi                # CLUSTER_TYPE
  export IPI_DIR="${HOME}/masconfig/sno" # IPI_DIR
  export IPI_CONTROLPLANE_REPLICAS=3     # IPI_CONTROLPLANE_REPLICAS
  export IPI_COMPUTE_REPLICAS=3          # IPI_COMPUTE_REPLICAS
}


# function set_sno_vars sets SNO specific variabels
function set_sno_vars() {
  export IPI_CONTROLPLANE_REPLICAS=1  # IPI_CONTROLPLANE_REPLICAS
  export IPI_COMPUTE_REPLICAS=0       # IPI_COMPUTE_REPLICAS
  export IPI_ROOTVOLUME_SIZE=250      # IPI_ROOTVOLUME_SIZE - 250GB following docs https://www.ibm.com/docs/en/masv-and-l/continuous-delivery?topic=clusters-installation-prerequisites
}

# function provision_aws_interactive contains the prompts for the different variables.
function provision_aws_interactive() {

  # prompt_aws_access_key_id            # AWS_ACCESS_KEY_ID
  prompt_for_secret "AWS Access Key ID" AWS_ACCESS_KEY_ID "Re-use saved AWS Access Key ID?" && export AWS_ACCESS_KEY_ID

  # prompt_aws_secret_access_key        # AWS_SECRET_ACCESS_KEY
  prompt_for_secret "AWS Secret Access Key" AWS_SECRET_ACCESS_KEY "Re-use saved AWS Secret Access Key?" && export AWS_SECRET_ACCESS_KEY

  # prompt_ipi_secret_file        # IPI_PULL_SECRET_FILE
  if [[ -z "$IPI_PULL_SECRET_FILE" ]]; then
    echo ""
    echo "Provide your Red Hat Pull Secret File. It can be downloaded via https://access.redhat.com/management."
    echo "You need a valid redhat account for downloading MAS license file (license.dat)"
    echo "environment variable) which will be used to provision an AWS instance."
    echo ""
    prompt_for_input "Red Hat Pull Secret File" IPI_PULL_SECRET_FILE && export IPI_PULL_SECRET_FILE
  else
    prompt_for_confirm_default_yes "Re-use saved IPI Pull Secret file '$IPI_PULL_SECRET_FILE'?" REUSE_IPI_PULL_SECRET_FILE
    if [[ "$REUSE_IPI_PULL_SECRET_FILE" == "false" ]]; then
      prompt_for_input "Red Hat Pull Secret File" IPI_PULL_SECRET_FILE && export IPI_PULL_SECRET_FILE
    fi
  fi
  if [[ ! -e "$IPI_PULL_SECRET_FILE" ]]; then
    echo_warning "Error: File does not exist: $IPI_PULL_SECRET_FILE"
    exit 1
  fi

  # prompt_aws_cluster_configuration    # CLUSTER_NAME
  echo ""
  echo_h2 "AWS Cluster Configuration"
  prompt_for_input "Cluster Name" CLUSTER_NAME && export CLUSTER_NAME

  prompt_for_input "AWS Region" IPI_REGION && export IPI_REGION       # IPI_REGION
  prompt_for_input "AWS Base Domain" IPI_BASE_DOMAIN && export IPI_BASE_DOMAIN    # IPI_BASE_DOMAIN
  prompt_for_confirm_default_yes "Do you want single node openshift " SNO_MODE    # SNO_NODE
  if [[ "$SNO_MODE" == "true" ]]; then
    set_sno_vars
  fi
  # prompt_ocp_version                  # OCP_VERSION
  echo
  echo "OCP Version:"
  echo "  1. 4.19 (MAS 8.10-9.2)"  
  echo "  2. 4.18 (MAS 8.10-9.1)"
  echo "  3. 4.17 (MAS 8.10-9.1)"
  echo "  4. 4.16 (MAS 8.10-9.1)"
  prompt_for_input "Select Version" OCP_VERSION_SELECTION "1"

  case $OCP_VERSION_SELECTION in
    1|4.19)
      export OCP_VERSION=latest-4.19
      ;;
    2|4.18)
      export OCP_VERSION=latest-4.18
      ;;
    3|4.17)
      export OCP_VERSION=latest-4.17
      ;;
    4|4.16)
      export OCP_VERSION=latest-4.16
      ;;
    *)
      export OCP_VERSION=$OCP_VERSION_SELECTION
      ;;
  esac


  # prompt_confirm                      # Confirm options
  echo
  reset_colors
  if [[ "$NO_CONFIRM" != "true" ]]; then
    prompt_for_confirm "Proceed with these settings" || exit 0
  fi

}


function provision_aws() {
  set_default_vars

  # Take the first parameter off (it will be provision-aws)
  shift
  if [[ $# -gt 0 ]]; then
    provision_aws_noninteractive "$@"
  else
    provision_aws_interactive
  fi

  ansible-playbook ibm.mas_devops.ocp_aws_provision || exit 1

  echo ""
  echo "AWS cluster is ready to use"
  OCP_CONSOLE_ROUTE=$(oc -n openshift-console get route console -o=jsonpath='{.spec.host}')
  echo "Connected to OCP cluster: https://$OCP_CONSOLE_ROUTE"

}
