#!/usr/bin/env bash

SCRIPT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"


init_rabbitmq() {
  RABBITMQ_CONFIG_DIR=${TEST_CONFIG_DIR}
  RABBITMQ_DOCKER_IMAGE=${RABBITMQ_DOCKER_IMAGE:-rabbitmq}

  print "> RABBITMQ_CONFIG_DIR: ${RABBITMQ_CONFIG_DIR}"
  print "> RABBITMQ_DOCKER_IMAGE: ${RABBITMQ_DOCKER_IMAGE}"
  [[ -z "${OAUTH_SERVER_CONFIG_BASEDIR}" ]] || print "> OAUTH_SERVER_CONFIG_BASEDIR: ${OAUTH_SERVER_CONFIG_BASEDIR}"
  [[ -z "${OAUTH_SERVER_CONFIG_DIR}" ]] || print "> OAUTH_SERVER_CONFIG_DIR: ${OAUTH_SERVER_CONFIG_DIR}"

  if [[ ! -d "${RABBITMQ_CONFIG_DIR}/certs" ]]; then 
    mkdir ${RABBITMQ_CONFIG_DIR}/certs
  fi 
  generate-ca-server-client-kpi rabbitmq $RABBITMQ_CONFIG_DIR/certs
  generate-server-keystore-if-required rabbitmq $RABBITMQ_CONFIG_DIR/certs
  generate-client-keystore-if-required rabbitmq $RABBITMQ_CONFIG_DIR/certs
  generate-truststore-if-required rabbitmq $RABBITMQ_CONFIG_DIR/certs
}

start_rabbitmq() {
  if [[ "$PROFILES" == *"docker"* ]]; then
      if [[ "$PROFILES" == *"cluster"* ]]; then
          start_docker_cluster_rabbitmq
      else
          start_docker_rabbitmq
      fi
  else
    start_local_rabbitmq
  fi
}
stop_rabbitmq() {
  if [[ "$PROFILES" == *"docker"* ]]; then
      if [[ "$PROFILES" == *"cluster"* ]]; then
          docker compose -f $CONF_DIR/rabbitmq/compose.yml kill
      else
          kill_container_if_exist "$component"
      fi
  else
      stop_local_rabbitmq
  fi
}
stop_local_rabbitmq() {
    RABBITMQ_SERVER_ROOT=$(realpath ../)
    gmake --directory=${RABBITMQ_SERVER_ROOT} stop-node
}
save_logs_rabbitmq() {
    if [[ "$PROFILES" == *"docker"* ]]; then
        if [[ "$PROFILES" == *"cluster"* ]]; then
            docker compose -f $CONF_DIR/rabbitmq/compose.yml logs > $LOGS/rabbitmq.log
        else
            save_container_logs "rabbitmq"
        fi
    fi
}
start_local_rabbitmq() {
  begin "Starting rabbitmq ..."

  init_rabbitmq

  RABBITMQ_SERVER_ROOT=$(realpath ../)
  
  MOUNT_RABBITMQ_CONF="/etc/rabbitmq/rabbitmq.conf"
  MOUNT_ADVANCED_CONFIG="/etc/rabbitmq/advanced.config"

  RABBITMQ_TEST_DIR="${RABBITMQ_CONFIG_DIR}" ${BIN_DIR}/gen-rabbitmq-conf "${PROFILES}" ${RABBITMQ_CONFIG_DIR} $ENV_FILE /tmp$MOUNT_RABBITMQ_CONF

  print "> EFFECTIVE RABBITMQ_CONFIG_FILE: /tmp$MOUNT_RABBITMQ_CONF"
  cp ${RABBITMQ_CONFIG_DIR}/enabled_plugins /tmp/etc/rabbitmq/
  RABBITMQ_ENABLED_PLUGINS=`cat /tmp/etc/rabbitmq/enabled_plugins | tr -d " \t\n\r" | awk -F'[][]' '{print $2}'`
  print "> EFFECTIVE PLUGINS: $RABBITMQ_ENABLED_PLUGINS"

  ${BIN_DIR}/gen-advanced-config "${PROFILES}" ${RABBITMQ_CONFIG_DIR} $ENV_FILE /tmp$MOUNT_ADVANCED_CONFIG
  RESULT=$?
  if [ $RESULT -eq 0 ]; then
    print "> EFFECTIVE RABBITMQ_CONFIG_FILE: /tmp$MOUNT_ADVANCED_CONFIG"    
    gmake --directory=${RABBITMQ_SERVER_ROOT}  \
        RABBITMQ_NODENAME="$RABBITMQ_NODENAME" \
        RABBITMQ_ENABLED_PLUGINS="$RABBITMQ_ENABLED_PLUGINS" \
  		RABBITMQ_CONFIG_FILE=/tmp$MOUNT_RABBITMQ_CONF \
        RABBITMQ_ADVANCED_CONFIG_FILE=/tmp$MOUNT_ADVANCED_CONFIG run-broker
  else
    gmake --directory=${RABBITMQ_SERVER_ROOT} \
        RABBITMQ_NODENAME="$RABBITMQ_NODENAME" \
        RABBITMQ_ENABLED_PLUGINS="$RABBITMQ_ENABLED_PLUGINS" \
  		RABBITMQ_CONFIG_FILE=/tmp$MOUNT_RABBITMQ_CONF run-broker
  fi
  print "> RABBITMQ_TEST_DIR: ${RABBITMQ_CONFIG_DIR}"


}
start_docker_cluster_rabbitmq() {
    begin "Starting rabbitmq cluster in docker ..."
    init_rabbitmq
    kill_container_if_exist rabbitmq
    kill_container_if_exist rabbitmq1
    kill_container_if_exist rabbitmq2

    mkdir -pv $CONF_DIR/rabbitmq/conf.d/

    RABBITMQ_TEST_DIR="/var/rabbitmq" 
    ${BIN_DIR}/gen-rabbitmq-conf "${PROFILES}" ${RABBITMQ_CONFIG_DIR} $ENV_FILE $CONF_DIR/rabbitmq/rabbitmq.conf
    print "> EFFECTIVE RABBITMQ_CONFIG_FILE: $CONF_DIR/rabbitmq/rabbitmq.conf"
    ${BIN_DIR}/gen-advanced-config "${PROFILES}" ${RABBITMQ_CONFIG_DIR} $ENV_FILE $CONF_DIR/rabbitmq/advanced.config
    RESULT=$?
    if [ $RESULT -eq 0 ]; then
        if [ -s $RESULT ]; then
            print "> EFFECTIVE ADVANCED_CONFIG_FILE: $CONF_DIR/rabbitmq/advanced.config"
        else
            rm $CONF_DIR/rabbitmq/advanced.config
        fi
    fi
    if [ -f ${RABBITMQ_CONFIG_DIR}/logging.conf ]; then
        cp ${RABBITMQ_CONFIG_DIR}/logging.conf $CONF_DIR/rabbitmq/conf.d/
    fi
    if [ -f ${RABBITMQ_CONFIG_DIR}/enabled_plugins ]; then
        cp ${RABBITMQ_CONFIG_DIR}/enabled_plugins $CONF_DIR/rabbitmq
    fi
    if [ -d ${RABBITMQ_CONFIG_DIR}/certs ]; then
        cp -r ${RABBITMQ_CONFIG_DIR}/certs $CONF_DIR/rabbitmq
    fi
    if [ -d ${RABBITMQ_CONFIG_DIR}/imports ]; then
        cp -r ${RABBITMQ_CONFIG_DIR}/imports $CONF_DIR/rabbitmq
    fi

    cat > $CONF_DIR/rabbitmq/image_compose.yml <<EOF
x-rabbitmq_image: &rabbitmq_image
    image: ${RABBITMQ_DOCKER_IMAGE}
    volumes:
    - $CONF_DIR/rabbitmq/:/etc/rabbitmq
    - $CONF_DIR/rabbitmq/:/var/rabbitmq
    - ${TEST_DIR}:/config
EOF
    cat $CONF_DIR/rabbitmq/image_compose.yml > $CONF_DIR/rabbitmq/compose.yml
    cat ${BIN_DIR}/components/../rabbit-compose.yml >> $CONF_DIR/rabbitmq/compose.yml

    docker compose -f $CONF_DIR/rabbitmq/compose.yml up -d

    wait_for_message rabbitmq "Server startup complete"
    wait_for_message rabbitmq1 "Server startup complete"
    wait_for_message rabbitmq2 "Server startup complete"
    end "RabbitMQ cluster ready"
}

start_docker_rabbitmq() {
  begin "Starting rabbitmq in docker ..."

  init_rabbitmq
  kill_container_if_exist rabbitmq

  mkdir -pv $CONF_DIR/rabbitmq/conf.d/

  RABBITMQ_TEST_DIR="/var/rabbitmq" 
  ${BIN_DIR}/gen-rabbitmq-conf "${PROFILES}" ${RABBITMQ_CONFIG_DIR} $ENV_FILE $CONF_DIR/rabbitmq/rabbitmq.conf
  print "> EFFECTIVE RABBITMQ_CONFIG_FILE: $CONF_DIR/rabbitmq/rabbitmq.conf"
  ${BIN_DIR}/gen-advanced-config "${PROFILES}" ${RABBITMQ_CONFIG_DIR} $ENV_FILE $CONF_DIR/rabbitmq/advanced.config
  RESULT=$?
  if [ $RESULT -eq 0 ]; then
      if [ -s $RESULT ]; then
          print "> EFFECTIVE ADVANCED_CONFIG_FILE: $CONF_DIR/rabbitmq/advanced.config"
      else
          rm $CONF_DIR/rabbitmq/advanced.config
      fi
  fi
  if [ -f ${RABBITMQ_CONFIG_DIR}/logging.conf ]; then
      cp ${RABBITMQ_CONFIG_DIR}/logging.conf $CONF_DIR/rabbitmq/conf.d/
  fi
  if [ -f ${RABBITMQ_CONFIG_DIR}/enabled_plugins ]; then
      cp ${RABBITMQ_CONFIG_DIR}/enabled_plugins $CONF_DIR/rabbitmq
  fi
  if [ -d "${RABBITMQ_CONFIG_DIR}/certs" ]; then
      cp -r ${RABBITMQ_CONFIG_DIR}/certs $CONF_DIR/rabbitmq
  fi
  if [ -d ${RABBITMQ_CONFIG_DIR}/imports ]; then
      cp -r ${RABBITMQ_CONFIG_DIR}/imports $CONF_DIR/rabbitmq
  fi

  print "> RABBITMQ_TEST_DIR: /var/rabbitmq"

  docker run \
    --detach \
    --name rabbitmq \
    --net ${DOCKER_NETWORK} \
    -p 5672:5672 \
    -p 5671:5671 \
    -p 15672:15672 \
    -p 15671:15671 \
    -p 5551:5551 \
    -v $CONF_DIR/rabbitmq/:/etc/rabbitmq \
    -v $CONF_DIR/rabbitmq/imports:/var/rabbitmq/imports \
    -v ${TEST_DIR}:/config \
    ${RABBITMQ_DOCKER_IMAGE}

  wait_for_message rabbitmq "Server startup complete"  
  end "RabbitMQ ready"
}
