#!/bin/bash

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

Mirror Mode (Required):
  -m, --mode ${COLOR_YELLOW}MIRROR_MODE${TEXT_RESET}                         Operation mode (direct, to-filesystem, from-filesystem)
  -d, --dir ${COLOR_YELLOW}MIRROR_WORKING_DIR${TEXT_RESET}                   Working directory for the mirror process

Registry Details (Required):
  -H, --host ${COLOR_YELLOW}REGISTRY_PUBLIC_HOST${TEXT_RESET}                 Hostname of the target registry
  -P, --port ${COLOR_YELLOW}REGISTRY_PUBLIC_PORT${TEXT_RESET}                 Port number for the target registry
  -u, --username ${COLOR_YELLOW}REGISTRY_USERNAME${TEXT_RESET}                Username to authenticate to the target registry
  -p, --password ${COLOR_YELLOW}REGISTRY_PASSWORD${TEXT_RESET}                Password to authenticate to the target registry

Registry Prefix (Optional):
  -x, --prefix ${COLOR_YELLOW}REGISTRY_PREFIX${TEXT_RESET}                    Prefix for the mirror image

AWS Elastic Container Registry (Optional):
  -r, --aws-ecr-region ${COLOR_YELLOW}REGISTRY_ECR_AWS_REGION${TEXT_RESET}    The AWS region if the target registry is Elastic Container Registry
  -e, --target-is-ecr                                                         Indicate that the target registry is Elastic Container Registry

Source Registry Entitlements (Required based on what content you choose to mirror):
      --ibm-entitlement ${COLOR_YELLOW}IBM_ENTITLEMENT_KEY${TEXT_RESET}       IBM Entitlement Key
      --artifactory-username ${COLOR_YELLOW}ARTIFACTORY_USERNAME${TEXT_RESET} Artifactory Username
      --artifactory-token ${COLOR_YELLOW}ARTIFACTORY_TOKEN${TEXT_RESET}       Artifactory Token

Maximo Operator Catalog Selection (Optional):
  -c, --catalog ${COLOR_YELLOW}MAS_CATALOG_VERSION${TEXT_RESET}               Maximo Operator Catalog Version to mirror (e.g. v9-240625-amd64)
  -C, --channel ${COLOR_YELLOW}MAS_CHANNEL${TEXT_RESET}                       Maximo Application Suite Channel to mirror (e.g. 9.1.x)

Content Selection (Core Platform):
      --mirror-catalog                            Mirror the IBM Maximo Operator Catalog
      --mirror-core                               Mirror images for IBM Maximo Application Suite Core

Content Selection (Applications):
      --mirror-assist                             Mirror images for IBM Maximo Assist
      --mirror-iot                                Mirror images for IBM Maximo IoT
      --mirror-manage                             Mirror images for IBM Maximo Manage
      --mirror-icd                                Mirror image  for IBM Maximo IT (Separately entitled IBM Maximo Manage extension)
      --mirror-monitor                            Mirror images for IBM Maximo Monitor
      --mirror-optimizer                          Mirror images for IBM Maximo Optimizer
      --mirror-predict                            Mirror images for IBM Maximo Predict
      --mirror-visualinspection                   Mirror images for IBM Maximo Visual Inspection

Content Selection (Cloud Pak for Data):
      --mirror-cp4d                               Mirror images for IBM Cloud Pak for Data Platform
      --mirror-wsl                                Mirror images for IBM Watson Studio Local
      --mirror-wml                                Mirror images for IBM Watson Machine Learning
      --mirror-spark                              Mirror images for IBM Analytics Engine (Spark)
      --mirror-cognos                             Mirror images for IBM Cognos Analytics

Content Selection (Other Dependencies):
      --mirror-cfs                                Mirror images for IBM Cloud Pak Foundation Services
      --mirror-sls                                Mirror images for IBM Suite License Service
      --mirror-tsm                                Mirror images for IBM Truststore Manager
      --mirror-mongo                              Mirror images for MongoDb Community Edition
      --mirror-mongo-v5                           Mirror images for MongoDb Community Edition version 5
      --mirror-mongo-v6                           Mirror images for MongoDb Community Edition version 6
      --mirror-mongo-v7                           Mirror images for MongoDb Community Edition version 7
      --mirror-db2                                Mirror images for IBM Db2
      --mirror-appconnect                         Mirror images for IBM AppConnect
      --mirror-odf                                Mirror images for ODF

Content Selection (All images included):
      --mirror-everything                         Mirror all MAS related images (including dependencies)

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

function mirror_everything() {
    # Core
    MIRROR_CATALOG=true
    MIRROR_MAS_CORE=true

    # Apps
    MIRROR_MAS_ASSIST=true
    MIRROR_MAS_IOT=true
    MIRROR_MAS_MANAGE=true
    MIRROR_MAS_ICD=true
    MIRROR_MAS_MONITOR=true
    MIRROR_MAS_OPTIMIZER=true
    MIRROR_MAS_PREDICT=true
    MIRROR_MAS_VISUALINSPECTION=true
    MIRROR_MAS_FACILITIES=true

    # Dependencies (Other)
    MIRROR_CATALOG=true
    MIRROR_COMMONSERVICES=true
    MIRROR_SLS=true
    MIRROR_TRUSTSTOREMGR=true
    MIRROR_MONGOCE=true
    MIRROR_MONGOCE_V4=true
    MIRROR_MONGOCE_V5=true
    MIRROR_MONGOCE_V6=true
    MIRROR_MONGOCE_V7=true
    MIRROR_MONGOCE_V8=true

    MIRROR_DB2U=true
    MIRROR_APPCONNECT=true
    MIRROR_ODF=true

    # Dependencies (CP4D)
    MIRROR_CP4D=true
    MIRROR_WSL=true
    MIRROR_WML=true
    MIRROR_SPARK=true
    MIRROR_COGNOS=true
}

function mirror_to_registry_noninteractive() {
  # Main content
  MIRROR_MAS_CORE=false
  MIRROR_MAS_ASSIST=false
  MIRROR_MAS_IOT=false
  MIRROR_MAS_MANAGE=false
  MIRROR_MAS_ICD=false
  MIRROR_MAS_MONITOR=false
  MIRROR_MAS_PREDICT=false
  MIRROR_MAS_OPTIMIZER=false
  MIRROR_MAS_VISUALINSPECTION=false
  MIRROR_MAS_FACILITIES=false

  # Dependencies
  MIRROR_CATALOG=false
  MIRROR_COMMONSERVICES=false
  MIRROR_SLS=false
  MIRROR_TRUSTSTOREMGR=false
  MIRROR_MONGOCE=false
  MIRROR_MONGOCE_V4=false
  MIRROR_MONGOCE_V5=false
  MIRROR_MONGOCE_V6=false
  MIRROR_MONGOCE_V7=false
  MIRROR_MONGOCE_V8=false
  MIRROR_DB2U=false
  MIRROR_CP4D=false
  MIRROR_WSL=false
  MIRROR_WML=false
  MIRROR_SPARK=false
  MIRROR_COGNOS=false
  MIRROR_APPCONNECT=false
  MIRROR_ODF=false

  while [[ $# -gt 0 ]]
  do
    key="$1"
    shift
    case $key in
      # Mirror Mode
      -m|--mode)
        MIRROR_MODE=$1 && shift
        ;;
      -d|--dir)
        MIRROR_WORKING_DIR=$1 && shift
        ;;

      # Registry Details
      -H|--host)
        REGISTRY_PUBLIC_HOST=$1 && shift
        ;;
      -P|--port)
        REGISTRY_PUBLIC_PORT=$1 && shift
        ;;
      -x| --prefix)
        REGISTRY_PREFIX=$1 && shift
        ;;
      -u|--username)
        REGISTRY_USERNAME=$1 && shift
        ;;
      -p|--password)
        REGISTRY_PASSWORD=$1 && shift
        ;;

      # AWS Elastic Container Registry
      -e|--target-is-ecr)
        REGISTRY_IS_ECR=true
        ;;
      -r|--aws-ecr-region)
        REGISTRY_ECR_AWS_REGION=$1 && shift
        ;;

      # Source Registry Entitlements
      --ibm-entitlement)
        IBM_ENTITLEMENT_KEY=$1 && shift
        ;;
      --artifactory-username)
        ARTIFACTORY_USERNAME=$1 && shift
        ;;
      --artifactory-apikey)
        ARTIFACTORY_TOKEN=$1 && shift
        ;;

      # Maximo Operator Catalog Selection
      -c|--catalog)
        MAS_CATALOG_VERSION=$1 && shift
        ;;
      -C|--channel)
        MAS_CHANNEL=$1 && shift
        ;;

      # Content Selection (Core Platform)
      --mirror-catalog)
        MIRROR_CATALOG=true
        ;;
      --mirror-core)
        MIRROR_MAS_CORE=true
        ;;

      # Content Selection (Applications):
      --mirror-assist)
        MIRROR_MAS_ASSIST=true
        ;;
      --mirror-iot)
        MIRROR_MAS_IOT=true
        ;;
      --mirror-manage)
        MIRROR_MAS_MANAGE=true
        ;;
      --mirror-icd)
        # Handle case where user selects to mirror ICD without selecting to mirror manage explicitly
        MIRROR_MAS_MANAGE=true
        MIRROR_MAS_ICD=true
        ;;
      --mirror-monitor)
        MIRROR_MAS_MONITOR=true
        ;;
      --mirror-predict)
        MIRROR_MAS_PREDICT=true
        ;;
      --mirror-optimizer)
        MIRROR_MAS_OPTIMIZER=true
        ;;
      --mirror-visualinspection)
        MIRROR_MAS_VISUALINSPECTION=true
        ;;
      --mirror-facilities)
        MIRROR_MAS_FACILITIES=true
        ;;

      # Content Selection (Other Dependencies)
      --mirror-cfs)
        MIRROR_COMMONSERVICES=true
        ;;
      --mirror-sls)
        MIRROR_SLS=true
        ;;
      --mirror-tsm)
        MIRROR_TRUSTSTOREMGR=true
        ;;
      --mirror-mongo)
        MIRROR_MONGOCE=true
        ;;
      --mirror-mongo-v4)
        MIRROR_MONGOCE_V4=true
        ;;
      --mirror-mongo-v5)
        MIRROR_MONGOCE_V5=true
        ;;
      --mirror-mongo-v6)
        MIRROR_MONGOCE_V6=true
        ;;
      --mirror-mongo-v7)
        MIRROR_MONGOCE_V7=true
        ;;
      --mirror-mongo-v8)
        MIRROR_MONGOCE_V8=true
        ;;
      --mirror-db2)
        MIRROR_DB2U=true
        ;;
      --mirror-appconnect)
        MIRROR_APPCONNECT=true
        ;;
      --mirror-odf)
        MIRROR_ODF=true
        ;;

      # Content Selection (Cloud Pak for Data)
      --mirror-cp4d)
        MIRROR_CP4D=true
        ;;
      --mirror-wsl)
        MIRROR_WSL=true
        ;;
      --mirror-wml)
        MIRROR_WML=true
        ;;
      --mirror-spark)
        MIRROR_SPARK=true
        ;;
      --mirror-cognos)
        MIRROR_COGNOS=true
        ;;
      --mirror-everything)
        MIRROR_EVERYTHING=true
        ;;

      --no-confirm)
        NO_CONFIRM=true
        ;;
      -h|--help)
        mirror_to_registry_help
        ;;
      *)
        # unknown option
        echo -e "${COLOR_RED}Usage Error: Unsupported option \"${key}\"${TEXT_RESET}\n"
        mirror_to_registry_help
        exit 1
        ;;
      esac
  done

  # Check all args have been set
  [[ -z "$MIRROR_MODE" ]] && mirror_to_registry_help "MIRROR_MODE is not set"
  [[ -z "$MIRROR_WORKING_DIR" ]] && mirror_to_registry_help "MIRROR_WORKING_DIR is not set"

  [[ -z "$MAS_CATALOG_VERSION" ]] && mirror_to_registry_help "MAS_CATALOG_VERSION is not set"
  [[ -z "$MAS_CHANNEL" ]] && mirror_to_registry_help "MAS_CHANNEL is not set"
  [[ -z "$IBM_ENTITLEMENT_KEY" ]] && mirror_to_registry_help "IBM_ENTITLEMENT_KEY is not set"

  [[ -z "$REGISTRY_PUBLIC_HOST" ]] && mirror_to_registry_help "REGISTRY_PUBLIC_HOST is not set"

  if [[ $MIRROR_MODE != "to-filesystem" && $REGISTRY_IS_ECR == "true" ]]; then
    REGISTRY_USERNAME="AWS"
    REGISTRY_PASSWORD=$(aws ecr get-login-password --region "$REGISTRY_ECR_AWS_REGION" --query 'authorizationData[].authorizationToken' --output text)
  elif [[ $MIRROR_MODE != "to-filesystem" ]]; then
    [[ -z "$REGISTRY_USERNAME" ]] && mirror_to_registry_help "REGISTRY_USERNAME is not set"
    [[ -z "$REGISTRY_PASSWORD" ]] && mirror_to_registry_help "REGISTRY_PASSWORD is not set"
  fi

  # Provide a default prefix - For future consideration
  # if [[ "$REGISTRY_PREFIX" == "" ]]; then
  #   REGISTRY_PREFIX=${MAS_CATALOG_VERSION#*-}  # removes the "v9-" prefix
  #   REGISTRY_PREFIX="mas-${REGISTRY_PREFIX%%-*}"  # removes the -arch suffix
  # fi

  if [[ "$MIRROR_EVERYTHING" == "true" ]]; then
    mirror_everything
  fi
}

function mirror_to_registry_interactive() {
  load_config
  echo
  echo_h2 "Configure Catalog Version (see https://ibm-mas.github.io/cli/catalogs/ for details on catalogs)"
  prompt_for_input "MAS Catalog Version" MAS_CATALOG_VERSION
  prompt_for_input "MAS Channel" MAS_CHANNEL

  # Provide a default prefix - For future consideration
  # DEFAULT_REGISTRY_PREFIX=${MAS_CATALOG_VERSION#*-}  # removes the "v9-" prefix
  # DEFAULT_REGISTRY_PREFIX="mas-${DEFAULT_REGISTRY_PREFIX%%-*}"  # removes the -arch suffix

  echo
  echo_h2 "Configure Mirror Mode"
  prompt_for_input "Working Directory" MIRROR_WORKING_DIR

  echo -e "${COLOR_YELLOW}Mirror Mode:"
  echo "  1. Direct"
  echo "  2. To filesystem"
  echo "  3. From filesystem"
  prompt_for_input "Select Mirror Mode" MIRROR_MODE_SELECTION "1"

  case $MIRROR_MODE_SELECTION in
    1|direct)
      MIRROR_MODE=direct
      ;;
    2|t|to|to-filesystem)
      MIRROR_MODE=to-filesystem
      ;;
    3|f|from|from-filesystem)
      MIRROR_MODE=from-filesystem
      ;;
    *)
      echo_warning "Invalid selection"
      exit 1
      ;;
  esac

  echo
  echo_h2 "Configure Target Mirror"
  prompt_for_input "Mirror Registry Host" REGISTRY_PUBLIC_HOST
  prompt_for_input "Mirror Registry Port" REGISTRY_PUBLIC_PORT
  prompt_for_input "Mirror Registry Prefix" REGISTRY_PREFIX

  if [[ $MIRROR_MODE != "to-filesystem" ]]; then
    echo
    echo_h2 "Configure Authentication"
    prompt_for_input "Mirror Registry Username" REGISTRY_USERNAME
    prompt_for_secret "Mirror Registry Password" REGISTRY_PASSWORD "Re-use saved registry password?"
  fi

  echo
  echo_h2 "Configure Images to Mirror"

  prompt_for_confirm "Mirror all MAS images (with dependencies)" MIRROR_EVERYTHING

  if [[ "$MIRROR_EVERYTHING" == "true" ]]; then
    mirror_everything
  else
    prompt_for_confirm_default_yes "IBM Maximo Operator Catalog" MIRROR_CATALOG

    prompt_for_confirm_default_yes "IBM Maximo Application Suite - Core" MIRROR_MAS_CORE

    prompt_for_confirm "IBM Maximo Application Suite - Assist" MIRROR_MAS_ASSIST
    prompt_for_confirm "IBM Maximo Application Suite - IoT" MIRROR_MAS_IOT
    prompt_for_confirm "IBM Maximo Application Suite - Manage" MIRROR_MAS_MANAGE
    if [[ "$MIRROR_MAS_MANAGE" == "true" ]]; then
      prompt_for_confirm "IBM Maximo Application Suite - Maximo IT (Separately entitled Manage extension)" MIRROR_MAS_ICD
    fi
    prompt_for_confirm "IBM Maximo Application Suite - Monitor" MIRROR_MAS_MONITOR
    prompt_for_confirm "IBM Maximo Application Suite - Optimizer" MIRROR_MAS_OPTIMIZER
    prompt_for_confirm "IBM Maximo Application Suite - Predict" MIRROR_MAS_PREDICT
    prompt_for_confirm "IBM Maximo Application Suite - Visual Inspection" MIRROR_MAS_VISUALINSPECTION
    prompt_for_confirm "IBM Maximo Application Suite - Facilities" MIRROR_MAS_FACILITIES

    prompt_for_confirm_default_yes "IBM Foundational Services" MIRROR_COMMONSERVICES
    prompt_for_confirm_default_yes "IBM Suite License Service" MIRROR_SLS
    prompt_for_confirm_default_yes "IBM Truststore Manager" MIRROR_TRUSTSTOREMGR
    if prompt_for_confirm_default_yes "MongoDb Community Edition"; then
      echo
      echo "MongoDb Community Edition options for mirroring:"
      echo "  1. Default MongoDb version set by catalog source (recommended)"
      echo "  2. MongoDb version 4"
      echo "  3. MongoDb version 5"
      echo "  4. Mirror all supported MongoDb versions"
      reset_colors
      echo
      prompt_for_input "Select the MongoDb Community Edition mirroring option" MONGOCE_SELECTION "1"
      echo

      case $MONGOCE_SELECTION in
        1)
          MIRROR_MONGOCE=true
          ;;
        2)
          MIRROR_MONGOCE_V4=true
          ;;
        3)
          MIRROR_MONGOCE_V5=true
          ;;
        4)
          MIRROR_MONGOCE=true
          MIRROR_MONGOCE_V4=true
          MIRROR_MONGOCE_V5=true
          ;;

        # Invalid Selection
        *)
          echo_warning "Invalid selection"
          exit 1
          ;;
      esac
    fi

    prompt_for_confirm_default_yes "IBM Db2" MIRROR_DB2U

    prompt_for_confirm "IBM Cloud Pak for Data (CP4D)" MIRROR_CP4D
    prompt_for_confirm "IBM Watson Studio Local" MIRROR_WSL
    prompt_for_confirm "IBM Watson Machine Learning" MIRROR_WML
    prompt_for_confirm "IBM Analytics Engine (Spark)" MIRROR_SPARK
    prompt_for_confirm "IBM Cognos Analytics" MIRROR_COGNOS

    prompt_for_confirm "IBM AppConnect" MIRROR_APPCONNECT
    prompt_for_confirm "Red Hat ODF" MIRROR_ODF
  fi

  if [[ "$MIRROR_MAS_ICD" == "true" ]]; then
    echo
    echo_h2 "Maximo IT Entitlement"
    echo "${TEXT_DIM}IBM Maximo IT is a separately entitled IBM Manage extension. The image mirroring process will fail unless you have purchased this separate entitlement"
    echo
    reset_colors
    prompt_for_confirm "Confirm IBM Maximo IT entitlement" CONFIRM_ICD || exit 0
  fi

  echo
  echo_h2 "Configure Authentication"
  prompt_for_secret "IBM Entitlement Key" IBM_ENTITLEMENT_KEY "Re-use saved IBM Entitlement Key?"

}


function mirror_one_thing() {
    MOT_RUNMIRROR=$1
    MOT_NAME=$2
    MOT_LOGFILE=$3
    MOT_PLAYBOOK=$4
    if [[ "$MOT_RUNMIRROR" == "true" ]]; then
    echo -en "\033[s" # Save cursor position
    echo -n "Mirroring ${MOT_NAME} ... ${MOT_LOGFILE}"
    ansible-playbook ibm.mas_devops.${MOT_PLAYBOOK} &> ${MOT_LOGFILE}
    mirror_result=$?
    echo -en "\033[1K" # Clear current line
    echo -en "\033[u" # Restore cursor position
    if [[ $mirror_result == "0" ]];
    then echo -e "${COLOR_GREEN}[SUCCESS] ${MOT_NAME}: ${MOT_LOGFILE}${TEXT_RESET}"
    else
      echo -e "${COLOR_RED}[FAILURE] ${MOT_NAME}: ${MOT_LOGFILE}${TEXT_RESET}"
      echo
      cat "$MOT_LOGFILE"
    fi
  else
    echo -e "${COLOR_MAGENTA}[SKIPPED] ${MOT_NAME}${TEXT_RESET}"
  fi
}


function show_mirror_status() {
  if [[ "$2" == "true" ]]
  then echo_reset_dim "$1 ${COLOR_GREEN}Mirror"
  else echo_reset_dim "$1 ${COLOR_RED}Skip"
  fi
}

function mirror_to_registry() {
  # Take the first parameter off (it will be mirror-images)
  shift
  if [[ $# -gt 0 ]]; then
    mirror_to_registry_noninteractive "$@"
  else
    mirror_to_registry_interactive
  fi

  # #Ensure all environment variables are available to ansible-playbook

  # General Config
  export MIRROR_MODE
  export MIRROR_WORKING_DIR
  export MAS_CATALOG_VERSION
  export MAS_CHANNEL

  export REGISTRY_PUBLIC_HOST
  export REGISTRY_PUBLIC_PORT
  export REGISTRY_PREFIX
  export REGISTRY_USERNAME
  export REGISTRY_PASSWORD

  export REGISTRY_IS_ECR
  export REGISTRY_ECR_AWS_REGION

  # Dependency control
  export MIRROR_CATALOG
  export MIRROR_COMMONSERVICES
  export MIRROR_SLS
  export MIRROR_TRUSTSTOREMGR
  export MIRROR_MONGOCE
  export MIRROR_MONGOCE_V4
  export MIRROR_MONGOCE_V5
  export MIRROR_MONGOCE_V6
  export MIRROR_MONGOCE_V7
  export MIRROR_MONGOCE_V8
  export MIRROR_DB2U
  export MIRROR_CP4D
  export MIRROR_WML
  export MIRROR_WSL
  export MIRROR_SPARK
  export MIRROR_COGNOS
  export MIRROR_APPCONNECT
  export MIRROR_ODF
  export MIRROR_MAS_ICD
  export MIRROR_EVERYTHING

  # Authentication
  export IBM_ENTITLEMENT_KEY
  export ARTIFACTORY_USERNAME
  export ARTIFACTORY_TOKEN

  if [[ "$MIRROR_CATALOG" == true ||
    "$MIRROR_COMMONSERVICES" == true ||
    "$MIRROR_SLS" == true ||
    "$MIRROR_TRUSTSTOREMGR" == true ||
    "$MIRROR_MONGOCE" == true ||
    "$MIRROR_MONGOCE_V4" == true ||
    "$MIRROR_MONGOCE_V5" == true ||
    "$MIRROR_MONGOCE_V6" == true ||
    "$MIRROR_MONGOCE_V7" == true ||
    "$MIRROR_MONGOCE_V8" == true ||
    "$MIRROR_DB2U" == true ||
    "$MIRROR_APPCONNECT" == true ||
    "$MIRROR_ODF" == true ||
    "$MIRROR_CP4D" == true ||
    "$MIRROR_WSL" == true ||
    "$MIRROR_WML" == true ||
    "$MIRROR_SPARK" == true ||
    "$MIRROR_COGNOS" == true ]]
  then
    MIRROR_DEPS=true
  else
    MIRROR_DEPS=false
  fi

  echo
  reset_colors
  echo_h2 "Review Settings"

  REGISTRY_URL=$REGISTRY_PUBLIC_HOST
  if [[ "$REGISTRY_PUBLIC_PORT" != "" ]]; then
    REGISTRY_URL+=":$REGISTRY_PUBLIC_PORT"
  fi
  if [[ "$REGISTRY_PREFIX" != "" ]]; then
    REGISTRY_URL+="/$REGISTRY_PREFIX"
  fi

  echo
  echo_h4 "Settings" "    "
  echo_reset_dim "Mirror Mode ......................... ${COLOR_MAGENTA}${MIRROR_MODE}"
  echo_reset_dim "Working Directory ................... ${COLOR_MAGENTA}${MIRROR_WORKING_DIR}"
  echo_reset_dim "Target Registry ..................... ${COLOR_MAGENTA}${REGISTRY_URL}"

  echo
  reset_colors
  echo_h4 "IBM Operator Catalog" "    "
  echo_reset_dim "Catalog Version ..................... ${COLOR_MAGENTA}${MAS_CATALOG_VERSION}"
  echo_reset_dim "MAS Update Channel .................. ${COLOR_MAGENTA}${MAS_CHANNEL}"

  # Core
  echo
  reset_colors
  echo_h4 "Content Selection (Core Platform)" "    "
  show_mirror_status "IBM Maximo Operator Catalog ........." $MIRROR_CATALOG
  show_mirror_status "IBM Maximo Application Suite Core ..." $MIRROR_MAS_CORE

  # Applications
  echo
  reset_colors
  echo_h4 "Content Selection (Applications)" "    "
  show_mirror_status "IBM Maximo Assist ..................." $MIRROR_MAS_ASSIST
  show_mirror_status "IBM Maximo IoT ......................" $MIRROR_MAS_IOT
  show_mirror_status "IBM Maximo Manage ..................." $MIRROR_MAS_MANAGE
  show_mirror_status "+ IBM Maximo IT ....................." $MIRROR_MAS_ICD
  show_mirror_status "IBM Maximo Monitor .................." $MIRROR_MAS_MONITOR
  show_mirror_status "IBM Maximo Predict .................." $MIRROR_MAS_PREDICT
  show_mirror_status "IBM Maximo Optimizer ................" $MIRROR_MAS_OPTIMIZER
  show_mirror_status "IBM Maximo Visual Inspection ........" $MIRROR_MAS_VISUALINSPECTION
  show_mirror_status "IBM Maximo Facilities ..............." $MIRROR_MAS_FACILITIES

  echo
  reset_colors
  echo_h4 "Content Selection (Cloud Pak for Data)" "    "
  show_mirror_status "IBM Cloud Pak for Data (CP4D) ......." $MIRROR_CP4D
  show_mirror_status "IBM Watson Studio ..................." $MIRROR_WSL
  show_mirror_status "IBM Watson Machine Learning ........." $MIRROR_WML
  show_mirror_status "IBM Analytics Engine (Spark)........." $MIRROR_SPARK
  show_mirror_status "IBM Cognos Analytics ................" $MIRROR_COGNOS

  echo
  reset_colors
  echo_h4 "Content Selection (Other Dependencies)" "    "
  show_mirror_status "IBM Cloud Pak Foundation Services ..." $MIRROR_COMMONSERVICES
  show_mirror_status "IBM Suite License Service ..........." $MIRROR_SLS
  show_mirror_status "IBM Truststore Manager .............." $MIRROR_TRUSTSTOREMGR
  show_mirror_status "MongoDb Community Edition ..........." $MIRROR_MONGOCE
  show_mirror_status "+ Version 4 ........................." $MIRROR_MONGOCE_V4
  show_mirror_status "+ Version 5 ........................." $MIRROR_MONGOCE_V5
  show_mirror_status "+ Version 6 ........................." $MIRROR_MONGOCE_V6
  show_mirror_status "+ Version 7 ........................." $MIRROR_MONGOCE_V7
  show_mirror_status "+ Version 8 ........................." $MIRROR_MONGOCE_V8
  show_mirror_status "IBM Db2 ............................." $MIRROR_DB2U
  show_mirror_status "IBM AppConnect ......................" $MIRROR_APPCONNECT
  show_mirror_status "RedHat ODF .........................." $MIRROR_ODF

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

  echo
  echo_h2 "Run Mirror Process"
  TIMESTAMP=$(date "+%Y%m%d-%H%M%S")
  LOG_PREFIX="$MIRROR_WORKING_DIR/logs/mirror-$TIMESTAMP"
  if [ ! -d $MIRROR_WORKING_DIR/logs/ ]; then
    mkdir -p $MIRROR_WORKING_DIR/logs/
  fi

  export ARTIFACTORY_USERNAME=""
  export ARTIFACTORY_TOKEN=""

  mirror_one_thing $MIRROR_MAS_CORE             "IBM Maximo Application Suite Core"     "$LOG_PREFIX-core.log"             mirror_core
  mirror_one_thing $MIRROR_MAS_ASSIST           "IBM Maximo Assist"                     "$LOG_PREFIX-assist.log"           mirror_add_assist
  mirror_one_thing $MIRROR_MAS_IOT              "IBM Maximo IoT"                        "$LOG_PREFIX-iot.log"              mirror_add_iot
  mirror_one_thing $MIRROR_MAS_MANAGE           "IBM Maximo Manage"                     "$LOG_PREFIX-manage.log"           mirror_add_manage
  mirror_one_thing $MIRROR_MAS_MONITOR          "IBM Maximo Monitor"                    "$LOG_PREFIX-monitor.log"          mirror_add_monitor
  mirror_one_thing $MIRROR_MAS_PREDICT          "IBM Maximo Predict"                    "$LOG_PREFIX-predict.log"          mirror_add_predict
  mirror_one_thing $MIRROR_MAS_OPTIMIZER        "IBM Maximo Optimizer"                  "$LOG_PREFIX-optimizer.log"        mirror_add_optimizer
  mirror_one_thing $MIRROR_MAS_VISUALINSPECTION "IBM Maximo Visual Inspection"          "$LOG_PREFIX-visualinspection.log" mirror_add_visualinspection
  mirror_one_thing $MIRROR_MAS_FACILITIES       "IBM Maximo Facilities"                 "$LOG_PREFIX-facilities.log"       mirror_add_facilities
  mirror_one_thing $MIRROR_DEPS                 "Selected Dependencies"                 "$LOG_PREFIX-dependencies.log"     mirror_dependencies
}
