#!/usr/bin/env bash

function gitops_deprovision_db2u_database_help() {
  [[ -n "$1" ]] && echo_warning "$1"
  reset_colors
  cat << EOM
Usage:
  mas gitops_deprovision_db2u_database [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.

Options:

GitOps Configuration:
  -d, --dir ${COLOR_YELLOW}GITOPS_WORKING_DIR${TEXT_RESET}           Working directory for GitOps repository
  -a, --account-id ${COLOR_YELLOW}ACCOUNT_ID${TEXT_RESET}            Account name that the cluster belongs to
  -r, --region-id ${COLOR_YELLOW}REGION_ID${TEXT_RESET}              Region ID
  -c, --cluster-id ${COLOR_YELLOW}CLUSTER_ID${TEXT_RESET}            Cluster ID
  -m, --mas-instance-id ${COLOR_YELLOW}MAS_INSTANCE_ID${TEXT_RESET}  IBM Suite Maximo Application Suite Instance ID
  --mas-app-id ${COLOR_YELLOW}MAS_APP_ID${TEXT_RESET}                IBM Suite Maximo Application Suite App that uses this db2u instance      
  --is-replica-task ${COLOR_YELLOW}IS_REPLICA_TASK${TEXT_RESET}      To deprovision standby database

Secrets Manager:
      --secrets-path ${COLOR_YELLOW}SECRETS_PATH${TEXT_RESET}                    Secrets Manager path
      --secrets-key-seperator ${COLOR_YELLOW}SECRETS_KEY_SEPERATOR${TEXT_RESET}  Secrets Manager key seperator string

IBM DB2U:
      --db2-instance-name ${COLOR_YELLOW}DB2_INSTANCE_NAME${TEXT_RESET}          DB2 Instance Name

Automatic GitHub Push:
  -P, --github-push ${COLOR_YELLOW}GITHUB_PUSH${TEXT_RESET}        Enable automatic push to GitHub
  -H, --github-host ${COLOR_YELLOW}GITHUB_HOST${TEXT_RESET}        GitHub Hostname for your GitOps repository
  -O, --github-org  ${COLOR_YELLOW}GITHUB_ORG${TEXT_RESET}         Github org for your GitOps repository
  -R, --github-repo ${COLOR_YELLOW}GITHUB_REPO${TEXT_RESET}        Github repo for your GitOps repository
  -B, --git-branch ${COLOR_YELLOW}GIT_BRANCH${TEXT_RESET}          Git branch to commit to of your GitOps repository
  -M, --git-commit-msg ${COLOR_YELLOW}GIT_COMMIT_MSG${TEXT_RESET}  Git commit message to use when committing to of your GitOps repository
  -S , --github-ssh  ${COLOR_YELLOW}GIT_SSH${TEXT_RESET}           Git ssh key path

Other Commands:
  -h, --help                                      Show this help message
EOM
  [[ -n "$1" ]] && exit 1 || exit 0
}

function gitops_deprovision_db2u_database_noninteractive() {
  GITOPS_WORKING_DIR=$PWD/working-dir
  SECRETS_KEY_SEPERATOR="/"
  GIT_COMMIT_MSG="gitops-deprovision-db2u-database commit"

  export REGION=${REGION:-${SM_AWS_REGION}}
  export REGION_ID=${REGION_ID:-${REGION}}

  while [[ $# -gt 0 ]]
  do
    key="$1"
    shift
    case $key in
      -d|--dir)
        export GITOPS_WORKING_DIR=$1 && shift
        ;;
      -g|--gitops-version)
        echo "${COLOR_YELLOW}WARNING: the -g|--gitops-version parameter is deprecated; it has no effect and will be removed in a future release${COLOR_RESET}"
        shift
        ;;
      -a|--account-id)
        export ACCOUNT_ID=$1 && shift
        ;;
      -r|--region-id)
        export REGION_ID=$1 && shift
        ;;
      -c|--cluster-id)
        export CLUSTER_ID=$1 && shift
        ;;
      -m|--mas-instance-id)
        export MAS_INSTANCE_ID=$1 && shift
        ;;
      --mas-app-id)
        export MAS_APP_ID=$1 && shift
        ;;
      # Secrets Manager
      --secrets-path)
        export SECRETS_PATH=$1 && shift
        ;;
      --secrets-key-seperator)
        export SECRETS_KEY_SEPERATOR=$1 && shift
        ;;

      # DB2
      --db2-instance-name)
        export DB2_INSTANCE_NAME=$1 && shift
        ;;
      --is-replica-task)
        export IS_REPLICA_TASK=$1 && shift
        ;;

      # Automatic GitHub Push
      -P|--github-push)
        export GITHUB_PUSH=true
        ;;
      -H|--github-host)
        export GITHUB_HOST=$1 && shift
        ;;
      -O|--github-org)
        export GITHUB_ORG=$1 && shift
        ;;
      -R|--github-repo)
        export GITHUB_REPO=$1 && shift
        ;;
      -B|--git-branch)
        export GIT_BRANCH=$1 && shift
        ;;
      -M|--git-commit-msg)
        export GIT_COMMIT_MSG=$1 && shift
        ;;
      -S|--github-ssh)
        export GIT_SSH=$1 && shift
        ;;

      -h|--help)
        gitops_deprovision_db2u_database_help
        ;;
      *)
        # unknown option
        echo -e "${COLOR_RED}Usage Error: Unsupported option \"${key}\"${COLOR_RESET}\n"
        gitops_deprovision_db2u_database_help  "Usage Error: Unsupported option \"${key}\" "
        exit 1
        ;;
      esac
  done

  [[ -z "$GITOPS_WORKING_DIR" ]] && gitops_deprovision_db2u_database_help "GITOPS_WORKING_DIR is not set"
  [[ -z "$CLUSTER_ID" ]] && gitops_deprovision_db2u_database_help "CLUSTER_ID is not set"
  [[ -z "$REGION_ID" ]] && gitops_deprovision_db2u_database_help "REGION_ID is not set"
  [[ -z "$ACCOUNT_ID" ]] && gitops_deprovision_db2u_database_help "ACCOUNT_ID is not set"
  [[ -z "$MAS_INSTANCE_ID" ]] && gitops_db2u_help "MAS_INSTANCE_ID is not set"
  [[ -z "$MAS_APP_ID" ]] && gitops_db2u_help "MAS_APP_ID is not set"
  if [[ "$GITHUB_PUSH" == "true" ]]; then
    [[ -z "$GITHUB_HOST" ]] && gitops_deprovision_db2u_database_help "GITHUB_HOST is not set"
    [[ -z "$GITHUB_ORG" ]] && gitops_deprovision_db2u_database_help "GITHUB_ORG is not set"
    [[ -z "$GITHUB_REPO" ]] && gitops_deprovision_db2u_database_help "GITHUB_REPO is not set"
    [[ -z "$GIT_BRANCH" ]] && gitops_deprovision_db2u_database_help "GIT_BRANCH is not set"
  fi
  if [[ -z $IS_REPLICA_TASK ]]; then
    export IS_REPLICA_TASK='false'
  fi
  if [[ -z $DB2_INSTANCE_NAME ]]; then
    if [[ $IS_REPLICA_TASK == 'true' ]]; then
      export DB2_INSTANCE_NAME=db2wh-${MAS_INSTANCE_ID}-${MAS_APP_ID}-sdb
    else
      export DB2_INSTANCE_NAME=db2wh-${MAS_INSTANCE_ID}-${MAS_APP_ID}
    fi
  fi
}

function gitops_deprovision_db2u_database() {
  # Take the first parameter off (it will be create-gitops)
  shift
  if [[ $# -gt 0 ]]; then
    gitops_deprovision_db2u_database_noninteractive "$@"
  else
    echo "Not supported yet"
    exit 1
    gitops_deprovision_db2u_database_interactive
  fi

  # catch errors
  set -o pipefail
  trap 'echo "[ERROR] Error occurred at $BASH_SOURCE, line $LINENO, exited with $?"; exit 1' ERR

  mkdir -p ${GITOPS_WORKING_DIR}
  GITOPS_INSTANCE_DIR=${GITOPS_WORKING_DIR}/${GITHUB_REPO}/${ACCOUNT_ID}/${CLUSTER_ID}/${MAS_INSTANCE_ID}
  CONFIGS_FILE="${GITOPS_INSTANCE_DIR}/ibm-db2u-databases.yaml"

  # NOTE: must align with lock branch name used by gitops_db2u_database script
  # as both of these scrtipts modify the same file
  GIT_LOCK_BRANCH=$(git_lock_branch_name "gitops-db2u-database" "${ACCOUNT_ID}" "${CLUSTER_ID}" "${MAS_INSTANCE_ID}")

  echo
  reset_colors
  echo_h2 "Review Settings"

  echo "${TEXT_DIM}"
  echo_h2 "Target" "    "
  echo_reset_dim "Account ID............................. ${COLOR_MAGENTA}${ACCOUNT_ID}"
  echo_reset_dim "Region ID ............................. ${COLOR_MAGENTA}${REGION_ID}"
  echo_reset_dim "Cluster ID ............................ ${COLOR_MAGENTA}${CLUSTER_ID}"
  echo_reset_dim "Application Directory ................. ${COLOR_MAGENTA}${GITOPS_INSTANCE_DIR}"
  reset_colors

  echo "${TEXT_DIM}"
  echo_h2 "Secrets Manager" "    "
  echo_reset_dim "Secrets Path .......................... ${COLOR_MAGENTA}${SECRETS_PATH}"
  reset_colors

  echo "${TEXT_DIM}"
  if [[ "$GITHUB_PUSH" == "true" ]]; then
    echo_h2 "GitOps Target" "    "
    echo_reset_dim "Automatic Push ........................ ${COLOR_GREEN}Enabled"
    echo_reset_dim "Working Directory ..................... ${COLOR_MAGENTA}${GITOPS_WORKING_DIR}"
    echo_reset_dim "Host .................................. ${COLOR_MAGENTA}${GITHUB_HOST}"
    echo_reset_dim "Organization .......................... ${COLOR_MAGENTA}${GITHUB_ORG}"
    echo_reset_dim "Repository ............................ ${COLOR_MAGENTA}${GITHUB_REPO}"
    echo_reset_dim "Branch ................................ ${COLOR_MAGENTA}${GIT_BRANCH}"
    echo_reset_dim "Lock Branch ........................... ${COLOR_MAGENTA}${GIT_LOCK_BRANCH}"
  else
    echo_h2 "GitOps Target" "    "
    echo_reset_dim "Automatic Push ........................ ${COLOR_RED}Disabled"
    echo_reset_dim "Working Directory ..................... ${COLOR_MAGENTA}${GITOPS_WORKING_DIR}"
  fi
  reset_colors

  echo "${TEXT_DIM}"
  echo_h2 "IBM Maximo Application Suite" "    "
  echo_reset_dim "Instance ID ........................... ${COLOR_MAGENTA}${MAS_INSTANCE_ID}"
  echo_reset_dim "MAS Application ID ..................... ${COLOR_MAGENTA}${MAS_APP_ID}"
  reset_colors

  echo "${TEXT_DIM}"
  echo_h2 "DB2 Cluster Configuration" "    "
  echo_reset_dim "db2-instance-name ....................... ${COLOR_MAGENTA}${DB2_INSTANCE_NAME}"
  echo_reset_dim "is-replica-task ......................... ${COLOR_MAGENTA}${IS_REPLICA_TASK}"
  reset_colors

  TEMP_DIR=$GITOPS_WORKING_DIR/tmp-deprovision-db2u-database
  mkdir -p $TEMP_DIR

  if [ -z $GIT_SSH ]; then
    export GIT_SSH="false"
  fi

  AVP_TYPE=aws  # Support for IBM will be added later
  sm_login

  # Clone github target repo
  # ---------------------------------------------------------------------------
  if [ "$GITHUB_PUSH" == "true" ]; then
    # only create the lock branch if we plan to actually push changes to git
    clone_and_lock_target_git_repo  "${GITHUB_HOST}" "${GITHUB_ORG}" "${GITHUB_REPO}" "${GIT_BRANCH}" "${GITOPS_WORKING_DIR}" "${GIT_SSH}" "${GIT_LOCK_BRANCH}"
  fi
  mkdir -p ${GITOPS_INSTANCE_DIR}


  # # Delete config that makes db2-databases root app to generate the ArgoCD application for this DB2 database instance
  # ---------------------------------------------------------------------------
  echo
  echo_h2 "Removing DB2U Database Configuraton for ${DB2_INSTANCE_NAME}"
  echo
  # If the file doesn't exist, nothing to remove, so no-op
  if [ -f ${CONFIGS_FILE} ]; then
    yq 'del(.ibm_db2u_databases[] | select(.db2_instance_name == "'${DB2_INSTANCE_NAME}'"))' $CONFIGS_FILE > ${TEMP_DIR}/configs.yaml

    cp ${TEMP_DIR}/configs.yaml ${CONFIGS_FILE}

    # If the file is there, but the configs are empty, delete the file
    CONFIGS_COUNT=$(yq '.ibm_db2u_databases | length' $CONFIGS_FILE)
    if [ "${CONFIGS_COUNT}" == "0" ]; then
      rm -rf $CONFIGS_FILE
    fi
  fi



  echo_h2 "Updated configuration file (${CONFIGS_FILE})"
  if [ -f ${CONFIGS_FILE} ]; then
    cat $CONFIGS_FILE
  else
    echo "<file was deleted>"
  fi


  # Commit and push to github target repo
  # ---------------------------------------------------------------------------
  if [ "$GITHUB_PUSH" == "true" ]; then
    echo
    echo_h2 "Commit and push changes to GitHub repo $GITHUB_ORG $GITHUB_REPO"
    save_and_unlock_target_git_repo "${GITHUB_REPO}" "${GIT_BRANCH}" "${GITOPS_WORKING_DIR}" "${GIT_COMMIT_MSG}" "${GIT_LOCK_BRANCH}"

    # Deletion of the DB2 config secret created by the postsync hook moved to the postdelete hook
    remove_git_repo_clone $GITOPS_WORKING_DIR/$GITHUB_REPO
  fi

  rm -rf $TEMP_DIR

}
