#!/usr/bin/env bash

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

GitOps Configuration:
  -d, --dir ${COLOR_YELLOW}GITOPS_WORKING_DIR${TEXT_RESET}           Directory for GitOps repository
  -a, --account-id ${COLOR_YELLOW}ACCOUNT_ID${TEXT_RESET}            Account name that the cluster belongs to
  -c, --cluster-id ${COLOR_YELLOW}CLUSTER_ID${TEXT_RESET}            Cluster ID
  -r, --region-id ${COLOR_YELLOW}REGION_ID${TEXT_RESET}              Region ID

IBM Maximo Application Suite:
  -m, --mas-instance-id ${COLOR_YELLOW}MAS_INSTANCE_ID${TEXT_RESET}   IBM Suite Maximo Application Suite Instance ID

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 CP4D Service:
      --cpd-product-version ${COLOR_YELLOW}CPD_PRODUCT_VERSION${TEXT_RESET}                             CP4D Product Version
      --cpd-instance-namespace ${COLOR_YELLOW}CPD_INSTANCE_NAMESPACE${TEXT_RESET}                       CP4D Instance namespace to use
      --cpd-operators-namespace ${COLOR_YELLOW}CPD_OPERATORS_NAMESPACE${TEXT_RESET}                     CP4D Operators namespace to use
      --cpd-service-name ${COLOR_YELLOW}CPD_SERVICE_NAME${TEXT_RESET}                                   CP4D Service Name
      --cpd-service-installplan-approval ${COLOR_YELLOW}CPD_SERVICE_INSTALLPLAN_APPROVAL${TEXT_RESET}   CP4D Service installplan approval ('Automatic' or 'Manual'. Default is 'Automatic')
      --cpd-service-block-storage-class ${COLOR_YELLOW}CPD_SERVICE_BLOCK_STORAGE_CLASS${TEXT_RESET}     CP4D Service blockstorage clas
      --cpd-service-storage-class ${COLOR_YELLOW}CPD_SERVICE_STORAGE_CLASS${TEXT_RESET}                 CP4D Service storage clas
      --cpd-service-deployment-type ${COLOR_YELLOW}CPD_SERVICE_DEPLOYMENT_TYPE${TEXT_RESET}             CP4D Service Deployment Type
      --cpd-service-scale-config ${COLOR_YELLOW}CPD_SERVICE_SCALE_CONFIG${TEXT_RESET}                   CP4D Service Scale Config
  (optional)
      --cpd-ccs-installplan ${COLOR_YELLOW}CPD_CCS_INSTALL_PLAN${TEXT_RESET}                            CP4D CCS installplan approval ('Automatic' or 'Manual'. Default is 'Automatic')
      --cpd-datarefinery-installplan ${COLOR_YELLOW}CPD_DATAREFINERY_INSTALL_PLAN${TEXT_RESET}          CP4D Datarinery installplan approval ('Automatic' or 'Manual'. Default is 'Automatic')
      --cpd-ws-installplan ${COLOR_YELLOW}CPD_WS_INSTALL_PLAN${TEXT_RESET}                              CP4D WS installplan approval ('Automatic' or 'Manual'. Default is 'Automatic')
      --cpd-rabbitmq-installplan ${COLOR_YELLOW}RABBITMQ_INSTALL_PLAN${TEXT_RESET}                      CP4D Rabbitmq installplan approval ('Automatic' or 'Manual'. Default is 'Automatic')
      --cpd-elasticsearch-installplan ${COLOR_YELLOW}ELASTICSEARCH_INSTALL_PLAN${TEXT_RESET}            CP4D Elasticsearch installplan approval ('Automatic' or 'Manual'. Default is 'Automatic')
      --cpd-opensearch-installplan ${COLOR_YELLOW}OPENSEARCH_INSTALL_PLAN${TEXT_RESET}                  CP4D Opensearch installplan approval ('Automatic' or 'Manual'. Default is 'Automatic')
      --cpd-canvasbase-installplan ${COLOR_YELLOW}CANVASBASE_INSTALL_PLAN${TEXT_RESET}                  CP4D Canvasbase installplan approval ('Automatic' or 'Manual'. Default is 'Automatic')


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_cp4d_service_noninteractive() {
  GITOPS_WORKING_DIR=$PWD/working-dir
  SECRETS_KEY_SEPERATOR="/"
  GIT_COMMIT_MSG="gitops-cp4d-service commit"

  export REGION_ID=${REGION_ID:-${SM_AWS_REGION}}
  export CPD_SERVICE_INSTALLPLAN_APPROVAL=${CPD_SERVICE_INSTALLPLAN_APPROVAL:-"Automatic"}
  export CPD_CCS_INSTALL_PLAN=${CPD_CCS_INSTALL_PLAN:-"Automatic"}
  export CPD_DATAREFINERY_INSTALL_PLAN=${CPD_DATAREFINERY_INSTALL_PLAN:-"Automatic"}
  export CPD_WS_INSTALL_PLAN=${CPD_WS_INSTALL_PLAN:-"Automatic"}
  export RABBITMQ_INSTALL_PLAN=${RABBITMQ_INSTALL_PLAN:-"Automatic"}
  export ELASTICSEARCH_INSTALL_PLAN=${ELASTICSEARCH_INSTALL_PLAN:-"Automatic"}
  export OPENSEARCH_INSTALL_PLAN=${OPENSEARCH_INSTALL_PLAN:-"Automatic"}
  export CANVASBASE_INSTALL_PLAN=${CANVASBASE_INSTALL_PLAN:-"Automatic"}


  while [[ $# -gt 0 ]]
  do
    key="$1"
    shift
    case $key in
      # GitOps Configuration
      -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
        ;;
      -c|--cluster-id)
        export CLUSTER_ID=$1 && shift
        ;;
      -r|--region-id)
        export REGION_ID=$1 && shift
        ;;

      # MAS
      -m|--mas-instance-id)
        export MAS_INSTANCE_ID=$1 && shift
        ;;

      # Secrets Manager
      --secrets-path)
        export SECRETS_PATH=$1 && shift
        ;;
      --secrets-key-seperator)
        export SECRETS_KEY_SEPERATOR=$1 && shift
        ;;

      # CP4D Service
      --cpd-product-version)
      export CPD_PRODUCT_VERSION=$1 && shift
        ;;
      --cpd-operators-namespace)
      export CPD_OPERATORS_NAMESPACE=$1 && shift
        ;;
      --cpd-instance-namespace)
      export CPD_INSTANCE_NAMESPACE=$1 && shift
        ;;
      --cpd-service-name)
      export CPD_SERVICE_NAME=$1 && shift
        ;;
      --cpd-service-installplan-approval)
      export CPD_SERVICE_INSTALLPLAN_APPROVAL=$1 && shift
        ;;
      --cpd-service-block-storage-class)
      export CPD_SERVICE_BLOCK_STORAGE_CLASS=$1 && shift
        ;;
      --cpd-service-storage-class)
      export CPD_SERVICE_STORAGE_CLASS=$1 && shift
        ;;
      --cpd-service-deployment-type)
      export CPD_SERVICE_DEPLOYMENT_TYPE=$1 && shift
        ;;
      --cpd-service-scale-config)
      export CPD_SERVICE_SCALE_CONFIG=$1 && shift
        ;;

      --cpd-ccs-installplan)
      export CPD_CCS_INSTALL_PLAN=$1 && shift
        ;;
      --cpd-datarefinery-installplan)
      export CPD_DATAREFINERY_INSTALL_PLAN=$1 && shift
        ;;
      --cpd-ws-installplan)
      export CPD_WS_INSTALL_PLAN=$1 && shift
        ;;
      --cpd-rabbitmq-installplan)
      export RABBITMQ_INSTALL_PLAN=$1 && shift
        ;;
      --cpd-elasticsearch-installplan)
      export ELASTICSEARCH_INSTALL_PLAN=$1 && shift
        ;;
      --cpd-opensearch-installplan)
      export OPENSEARCH_INSTALL_PLAN=$1 && shift
        ;;
      --cpd-canvasbase-installplan)
      export CANVASBASE_INSTALL_PLAN=$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
        ;;

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

  [[ -z "$GITOPS_WORKING_DIR" ]] && gitops_cp4d_service_help "GITOPS_WORKING_DIR is not set"
  [[ -z "$ACCOUNT_ID" ]] && gitops_cp4d_service_help "ACCOUNT_ID is not set"
  [[ -z "$CLUSTER_ID" ]] && gitops_cp4d_service_help "CLUSTER_ID is not set"
  [[ -z "$REGION_ID" ]] && gitops_cp4d_help "REGION_ID is not set"

  #MAS
  [[ -z "$MAS_INSTANCE_ID" ]] && gitops_cp4d_service_help "MAS_INSTANCE_ID is not set"

  [[ -z "$CPD_SERVICE_NAME" ]] && gitops_cp4d_service_help "CPD_SERVICE_NAME is not set"
  [[ -z "$CPD_PRODUCT_VERSION" ]] && gitops_cp4d_service_help "CPD_PRODUCT_VERSION is not set"
  [[ -z "$CPD_SERVICE_BLOCK_STORAGE_CLASS" ]] && gitops_cp4d_service_help "CPD_SERVICE_BLOCK_STORAGE_CLASS is not set"
  [[ -z "$CPD_SERVICE_STORAGE_CLASS" ]] && gitops_cp4d_service_help "CPD_SERVICE_STORAGE_CLASS is not set"

  if [[ "$GITHUB_PUSH" == "true" ]]; then
    [[ -z "$GITHUB_HOST" ]] && gitops_cp4d_service_help "GITHUB_HOST is not set"
    [[ -z "$GITHUB_ORG" ]] && gitops_cp4d_service_help "GITHUB_ORG is not set"
    [[ -z "$GITHUB_REPO" ]] && gitops_cp4d_service_help "GITHUB_REPO is not set"
    [[ -z "$GIT_BRANCH" ]] && gitops_cp4d_service_help "GIT_BRANCH is not set"
  fi

}

function gitops_cp4d_service() {
  # Take the first parameter off (it will be create-gitops)
  shift
  if [[ $# -gt 0 ]]; then
    gitops_cp4d_service_noninteractive "$@"
  else
    echo "Not supported yet"
    exit 1
    gitops_cp4d_service_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}

  export CPD_OPERATORS_NAMESPACE=${CPD_OPERATORS_NAMESPACE:-"ibm-cpd-${MAS_INSTANCE_ID}-operators"}
  export CPD_INSTANCE_NAMESPACE=${CPD_INSTANCE_NAMESPACE:-"ibm-cpd-${MAS_INSTANCE_ID}-instance"}
  export CPD_SERVICE_SCALE_CONFIG=${CPD_SERVICE_SCALE_CONFIG:-small}

  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 "Cluster ID ............................ ${COLOR_MAGENTA}${CLUSTER_ID}"
  echo_reset_dim "Instance Config 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}"
  echo_h2 "IBM Maximo Application Suite" "    "
  echo_reset_dim "Instance ID ............................. ${COLOR_MAGENTA}${MAS_INSTANCE_ID}"
  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}"
  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 "CP4D Service" "    "
  echo_reset_dim "CPD_OPERATORS_NAMESPACE  .................... ${COLOR_MAGENTA}${CPD_OPERATORS_NAMESPACE}"
  echo_reset_dim "CPD_INSTANCE_NAMESPACE  ..................... ${COLOR_MAGENTA}${CPD_INSTANCE_NAMESPACE}"
  echo_reset_dim "CPD_SERVICE_NAME  ........................... ${COLOR_MAGENTA}${CPD_SERVICE_NAME}"
  echo_reset_dim "CPD_SERVICE_INSTALLPLAN_APPROVAL  ........... ${COLOR_MAGENTA}${CPD_SERVICE_INSTALLPLAN_APPROVAL}"
  echo_reset_dim "CPD_SERVICE_BLOCK_STORAGE_CLASS  ............ ${COLOR_MAGENTA}${CPD_SERVICE_BLOCK_STORAGE_CLASS}"
  echo_reset_dim "CPD_SERVICE_STORAGE_CLASS  .................. ${COLOR_MAGENTA}${CPD_SERVICE_STORAGE_CLASS}"
  echo_reset_dim "CPD_SERVICE_DEPLOYMENT_TYPE  ................ ${COLOR_MAGENTA}${CPD_SERVICE_DEPLOYMENT_TYPE}"
  echo_reset_dim "CPD_CCS_INSTALL_PLAN  ....................... ${COLOR_MAGENTA}${CPD_CCS_INSTALL_PLAN}"
  echo_reset_dim "CPD_DATAREFINERY_INSTALL_PLAN  .............. ${COLOR_MAGENTA}${CPD_DATAREFINERY_INSTALL_PLAN}"
  echo_reset_dim "CPD_WS_INSTALL_PLAN  ........................ ${COLOR_MAGENTA}${CPD_WS_INSTALL_PLAN}"
  echo_reset_dim "RABBITMQ_INSTALL_PLAN  ...................... ${COLOR_MAGENTA}${RABBITMQ_INSTALL_PLAN}"
  echo_reset_dim "ELASTICSEARCH_INSTALL_PLAN  ................. ${COLOR_MAGENTA}${ELASTICSEARCH_INSTALL_PLAN}"
  echo_reset_dim "OPENSEARCH_INSTALL_PLAN  .................... ${COLOR_MAGENTA}${OPENSEARCH_INSTALL_PLAN}"
  reset_colors


  GIT_LOCK_BRANCH=$(git_lock_branch_name "gitops-cp4d-service" "${ACCOUNT_ID}" "${CLUSTER_ID}" "${MAS_INSTANCE_ID}")
  CURRENT_DIR=$PWD
  TEMP_DIR=$CURRENT_DIR/tmp-cp4d-service
  mkdir -p $TEMP_DIR

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


  # We want to use CP4D 4.8 but we need to wait for it to be ready in automation and product
  # In order to not block use we will just install using ansible-devops
  AVP_TYPE=aws  # Support for IBM will be added later

  export SECRET_KEY_CCS_VERSION=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}ccs_version#ccs_version

  if [[ "$CPD_SERVICE_NAME" == "wsl" || "$CPD_SERVICE_NAME" == "wml" || "$CPD_SERVICE_NAME" == "spss" ]]; then
    export SECRET_KEY_CCS_CHANNEL=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}ccs_channel#ccs_channel
    export SECRET_KEY_DATAREFINERY_CHANNEL=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}datarefinery_channel#datarefinery_channel
    export SECRET_KEY_WS_RUNTIMES_CHANNEL=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}ws_runtimes_channel#ws_runtimes_channel
    export SECRET_KEY_OPENCONTENT_RABBITMQ_CHANNEL=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}opencontent_rabbitmq_channel#opencontent_rabbitmq_channel
    export SECRET_KEY_OPENCONTENT_ELASTICSEARCH_CHANNEL=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}opencontent_elasticsearch_channel#opencontent_elasticsearch_channel
    export SECRET_KEY_OPENCONTENT_OPENSEARCH_CHANNEL=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}opencontent_opensearch_channel#opencontent_opensearch_channel
  fi

  if [[ "$CPD_SERVICE_NAME" == "wsl" ]]; then
    export SECRET_KEY_WSL_VERSION=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}wsl_version#wsl_version
    export SECRET_KEY_WSL_CHANNEL=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}wsl_channel#wsl_channel
    export SECRET_KEY_DATAREFINERY_VERSION=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}datarefinery_version#datarefinery_version
    export SECRET_KEY_WS_RUNTIMES_VERSION=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}ws_runtimes_version#ws_runtimes_version
    export WSL_INSTALL_PLAN=${CPD_SERVICE_INSTALLPLAN_APPROVAL}
  fi

  if [[ "$CPD_SERVICE_NAME" == "wml" ]]; then
    export SECRET_KEY_WML_VERSION=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}wml_version#wml_version
    export SECRET_KEY_WML_CHANNEL=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}wml_channel#wml_channel
    export WML_INSTALL_PLAN=${CPD_SERVICE_INSTALLPLAN_APPROVAL}
  fi

  if [[ "$CPD_SERVICE_NAME" == "spark" ]]; then
    export SECRET_KEY_SPARK_CHANNEL=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}spark_channel#spark_channel
    export SECRET_KEY_SPARK_VERSION=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}spark_version#spark_version
    export SPARK_INSTALL_PLAN=${CPD_SERVICE_INSTALLPLAN_APPROVAL}
  fi

  if [[ "$CPD_SERVICE_NAME" == "spss" ]]; then
    export SECRET_KEY_SPSS_CHANNEL=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}spss_channel#spss_channel
    export SECRET_KEY_SPSS_VERSION=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}spss_version#spss_version
    export SECRET_KEY_CANVASBASE_CHANNEL=${ACCOUNT_ID}${SECRETS_KEY_SEPERATOR}${CLUSTER_ID}${SECRETS_KEY_SEPERATOR}${MAS_INSTANCE_ID}${SECRETS_KEY_SEPERATOR}canvasbase_channel#canvasbase_channel
    export SPSS_INSTALL_PLAN=${CPD_SERVICE_INSTALLPLAN_APPROVAL}
    export CANVASBASE_INSTALL_PLAN=${CANVASBASE_INSTALL_PLAN}
  fi

  # Set and Validate App Names
  # ---------------------------------------------------------------------------
  CLUSTER_ROOT_APP="cluster.${CLUSTER_ID}"
  INSTANCE_ROOT_APP="instance.${CLUSTER_ID}.${MAS_INSTANCE_ID}"
  CPD_SERVICE_APP_NAME="${CPD_SERVICE_NAME}.${CLUSTER_ID}.${MAS_INSTANCE_ID}"

  validate_app_name "${CLUSTER_ROOT_APP}"
  validate_app_name "${INSTANCE_ROOT_APP}"
  validate_app_name "${CPD_SERVICE_APP_NAME}"


  # 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}

  # Generate ArgoApps
  # ----------------------------------------------------------------------------
  echo
  echo_h2 "Generating CPD Service (${CPD_SERVICE_NAME}) Application"

  if [[ "$CPD_SERVICE_NAME" == "wsl" || "$CPD_SERVICE_NAME" == "wml" || "$CPD_SERVICE_NAME" == "spss" ]]; then
    echo "Generating IBM CPD Service file ${GITOPS_INSTANCE_DIR}/ibm-cp4d-services-base.yaml"
    jinjanate_commmon $CLI_DIR/templates/gitops/appset-configs/cluster/instance/ibm-cp4d-services-base.yaml.j2 ${GITOPS_INSTANCE_DIR}/ibm-cp4d-services-base.yaml
  fi
  
  echo
  echo "- ${CPD_SERVICE_NAME} operator"

  echo "Generating IBM CPD Service file ${GITOPS_INSTANCE_DIR}/ibm-${CPD_SERVICE_NAME}.yaml"
  jinjanate_commmon $CLI_DIR/templates/gitops/appset-configs/cluster/instance/ibm-${CPD_SERVICE_NAME}.yaml.j2 ${GITOPS_INSTANCE_DIR}/ibm-${CPD_SERVICE_NAME}.yaml

  # 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}" CP4D_SERVICE_CHANGED
    remove_git_repo_clone $GITOPS_WORKING_DIR/$GITHUB_REPO
  fi

  rm -rf $TEMP_DIR

}
