#!/bin/bash

. $CLI_DIR/functions/help/mirror_redhat_help

function mirror_redhat_noninteractive() {
  # Red Hat
  MIRROR_REDHAT_PLATFORM=false
  MIRROR_REDHAT_OPERATORS=false
  while [[ $# -gt 0 ]]
  do
    key="$1"
    shift
    case $key in
      # Basic mode of operation
      -m|--mode)
        MIRROR_MODE=$1 && shift
        ;;
      -d|--dir)
        MIRROR_WORKING_DIR=$1 && shift
        ;;

      # What to mirror
      --mirror-platform)
        MIRROR_REDHAT_PLATFORM=true
        ;;
      --mirror-operators)
        MIRROR_REDHAT_OPERATORS=true
        ;;

      # Registry
      -H|--host)
        REGISTRY_PUBLIC_HOST=$1 && shift
        ;;
      -P|--port)
        REGISTRY_PUBLIC_PORT=$1 && shift
        ;;
      -x| --prefix)
        REGISTRY_PREFIX_REDHAT=$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
        ;;

      # Pull secret
      --pullsecret)
        REDHAT_PULLSECRET=$1 && shift
        ;;

      # Content Selection (Optional)
      --release)
        OCP_RELEASE=$1 && shift
        ;;

      # Platform Version Range (Optional)
      --min-version)
        OCP_MIN_VERSION=$1 && shift
        ;;
      --max-version)
        OCP_MAX_VERSION=$1 && shift
        ;;

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

  # Check all args have been set
  [[ -z "$MIRROR_MODE" ]] && mirror_redhat_help "MIRROR_MODE is not set"
  [[ -z "$MIRROR_WORKING_DIR" ]] && mirror_redhat_help "MIRROR_WORKING_DIR 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)
  fi

  if [[ "$MIRROR_MODE" == "direct" ]] || [[ "$MIRROR_MODE" == "from-filesystem" ]]; then
    [[ -z "$REGISTRY_PUBLIC_HOST" ]] && mirror_redhat_help "REGISTRY_PUBLIC_HOST is not set"
  fi

  [[ -z "$REDHAT_PULLSECRET" ]] && mirror_redhat_help "REDHAT_PULLSECRET is not set"

  if [[ "$MIRROR_MODE" == "direct" ]] || [[ "$MIRROR_MODE" == "to-filesystem" ]]; then
    [[ -z "$OCP_RELEASE" ]] && mirror_redhat_help "OCP_RELEASE is not set"
    if [[ "$MIRROR_REDHAT_PLATFORM" == "false" ]] && [[ "$MIRROR_REDHAT_OPERATORS" == "false" ]]; then
      echo "Nothing to do.  Select what content to mirror using --mirror-product and/or --mirror-operators"
      exit 0
    fi
  fi

  # Provide a default prefix - For future consideration
  # if [[ "$REGISTRY_PREFIX_REDHAT" == "" ]]; then
  #   REGISTRY_PREFIX_REDHAT="ocp-${OCP_RELEASE/./}"
  # fi
}

function mirror_redhat_interactive() {
  load_config
  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 Images to Mirror"
  echo_h3 "Select OCP Release"
  echo "${TEXT_DIM}Select the release to mirror content for:"

  echo "Supported OCP Releases:"
  echo "  1) 4.19"
  echo "  2) 4.18"
  echo "  3) 4.17"
  echo "  4) 4.16"
  reset_colors

  echo
  prompt_for_input "Select OCP Release" OCP_RELEASE_SELECTION "1"

  case $OCP_RELEASE_SELECTION in
    1)
      OCP_RELEASE=4.19
      ;;
    2)
      OCP_RELEASE=4.18
      ;;
    3)
      OCP_RELEASE=4.17
      ;;
    4)
      OCP_RELEASE=4.16
      ;;
    *)
      echo_warning "Invalid selection"
      exit 1
      ;;
  esac

  # Provide a default prefix - For future consideration
  # DEFAULT_REGISTRY_PREFIX_REDHAT="ocp-${OCP_RELEASE/./}"

  if [[ "$MIRROR_MODE" == "direct" ]] || [[ "$MIRROR_MODE" == "from-filesystem" ]]; then
    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_REDHAT
    prompt_for_input "Mirror Registry Username" REGISTRY_USERNAME
    prompt_for_secret "Mirror Registry Password" REGISTRY_PASSWORD "Re-use saved registry password?"
  fi

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

  echo
  echo_h2 "Configure Red Hat Authentication"
  echo "Path to your Red Hat pull secret, available from:"
  echo "  - ${COLOR_CYAN}${TEXT_UNDERLINE}https://console.redhat.com/openshift/install/pull-secret${TEXT_RESET}"
  echo
  prompt_for_input "Red Hat Pull Secret" REDHAT_PULLSECRET


  echo_h3 "Red Hat OCP Release"
  echo "${TEXT_DIM}Mirror the Red Hat OCP release to your registry, you must select the mininum and maximum version of the release that you want mirrored."
  echo
  if [[ "$MIRROR_MODE" == "direct" ]] || [[ "$MIRROR_MODE" == "from-filesystem" ]]; then
    echo "Images will be mirrored to:"
    echo "  - $REGISTRY_URL/openshift/release"
    echo "  - $REGISTRY_URL/openshift/release-images"
    echo
  fi
  echo "An ImageDigestMirrorSet must be configured in the cluster to make use of the mirrored release (see ${COLOR_CYAN}mas configure-airgap${TEXT_RESET})"
  echo

  prompt_for_confirm "Mirror Red Hat OCP release" MIRROR_REDHAT_PLATFORM
  if [[ "$MIRROR_REDHAT_PLATFORM" == "true" ]]; then
    prompt_for_input "Minimum Version (x.y.z)" OCP_MIN_VERSION
    prompt_for_input "Maximum Version (x.y.z)" OCP_MAX_VERSION
  fi

  echo_h3 "Red Hat OCP Operator Catalogs"
  echo "${TEXT_DIM}Mirror selected content from the Red Hat OCP operator catalogs to your registry, only the following content will be included from each catalog:"
  echo
  echo "Certified Operators:"
  echo " - crunchy-postgres-operator (v5)"
  echo " - gpu-operator-certified (v23.3)"
  echo " - kubeturbo-certified (stable)"
  echo
  echo "Community Operators:"
  echo " - grafana-operator (v4)"
  echo " - opentelemetry-operator (alpha)"
  echo " - strimzi-kafka-operator (stable)"
  echo
  echo "Red Hat Operators:"
  echo " - amq-streams (stable)"
  echo " - openshift-pipelines-operator-rh (latest)"
  echo " - nfd (stable)"
  echo " - aws-efs-csi-driver-operator (stable)"
  echo " - local-storage-operator (stable)"
  echo " - odf-operator (stable-${OCP_RELEASE})"
  echo
  echo "An ImageDigestMirrorSet must be configured in the cluster to make use of the mirrored release (see ${COLOR_CYAN}mas configure-airgap${TEXT_RESET})"
  echo

  prompt_for_confirm "Mirror selected content from Red Hat OCP operator catalogs" MIRROR_REDHAT_OPERATORS
}

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

  # Ensure all environment variables are available to ansible-playbook

  # General Config
  export MIRROR_MODE
  export MIRROR_WORKING_DIR
  export MIRROR_REDHAT_PLATFORM
  export MIRROR_REDHAT_OPERATORS
  export REDHAT_PULLSECRET
  export OCP_RELEASE
  export OCP_MIN_VERSION
  export OCP_MAX_VERSION

  # Target Registry
  export REGISTRY_PUBLIC_HOST
  export REGISTRY_PUBLIC_PORT
  export REGISTRY_PREFIX_REDHAT
  export REGISTRY_USERNAME
  export REGISTRY_PASSWORD

  # AWS Elastic Container Registry
  export REGISTRY_IS_ECR
  export REGISTRY_ECR_AWS_REGION

  echo
  reset_colors
  echo_h2 "Review Settings"
  echo
  echo_h4 "Configuration" "    "
  echo_reset_dim "Mirror Mode ........................... ${COLOR_MAGENTA}${MIRROR_MODE}"
  echo_reset_dim "Working Directory ..................... ${COLOR_MAGENTA}${MIRROR_WORKING_DIR}"
  echo_reset_dim "Authentication ........................ ${COLOR_MAGENTA}${REDHAT_PULLSECRET}"

  if [[ "$MIRROR_MODE" == "direct" ]] || [[ "$MIRROR_MODE" == "from-filesystem" ]]; then
    echo_reset_dim "Target Registry ....................... ${COLOR_MAGENTA}${REGISTRY_URL}"
  fi

  echo
  reset_colors
  echo_h4 "Red Hat Content" "    "
  echo_reset_dim "OpenShift Release ..................... ${COLOR_MAGENTA}${OCP_RELEASE}"

  if [[ "$MIRROR_REDHAT_PLATFORM" == "true" ]]; then
    echo_reset_dim "Mirror Release ........................ ${COLOR_GREEN}Yes"
    echo_reset_dim "- Minimum Version ..................... ${COLOR_MAGENTA}${OCP_MIN_VERSION:-undefined}"
    echo_reset_dim "- Maximum Version ..................... ${COLOR_MAGENTA}${OCP_MAX_VERSION:-undefined}"
  else
    echo_reset_dim "Mirror Release ........................ ${COLOR_RED}No"
  fi

  if [[ "$MIRROR_REDHAT_OPERATORS" == "true" ]]
  then echo_reset_dim "Mirror Operator Catalogs .............. ${COLOR_GREEN}Yes"
  else echo_reset_dim "Mirror Operator Catalogs .............. ${COLOR_RED}No"
  fi

  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

  mirror_one_thing true "Red Hat Content" "$LOG_PREFIX-redhat.log"  mirror_openshift

}
