#!/bin/bash
# -----------------------------------------------------------------------------
# Risk by Context™ Commnad Utility Script
# -----------------------------------------------------------------------------
# Copyright (c) 2025 asvin GmbH

# Default values
debug=false
version="Risk by Context™ CLI version 1.0"

# Help message
usage() {
  echo "Usage: $0 [OPTIONS] COMMAND [ARGS]"
  echo ""
  echo "Options:"
  echo "  -h            Show this help message"
  echo "  -d            Enable debug mode"
  echo "  -v            Show version of the RBC CLI"
  echo ""
  echo "Commands:"
  echo "  load <name>        Load docker images by name. Options:"
  echo "                            : Load all images"
  echo "                   - portal : The Portal"
  echo "                   - device : The Device service"
  echo "                   - mongo  : The MongoDB"
  echo ""
  echo "  ps                 Show status of all RBC containers"
  echo ""
  echo "  up <name>          Create and start docker containers. Options:"
  echo "                            : Restart all containers"
  echo "                   - portal : The Portal"
  echo "                   - device : The Device service"
  echo "                   - mongo  : The MongoDB"
  echo ""
  echo "  down <name>        Stop and remove docker contianers. Options:"
  echo "                            : Restart all containers"
  echo "                   - portal : The Portal"
  echo "                   - device : The Device service"
  echo "                   - mongo  : The MongoDB"
  echo ""
  echo "  restart <name>     Remove and create docker containers. Options:"
  echo "                            : Restart all containers"
  echo "                   - portal : The Portal"
  echo "                   - device : The Device service"
  echo "                   - mongo  : The MongoDB"
  echo ""
  echo "  upgrade <name>     Load docker images and restart containers. Options:"
  echo "                            : Upgrade all containers"
  echo "                   - portal : The Portal"
  echo "                   - device : The Device service"
  echo "                   - mongo  : The MongoDB"
  echo ""
  echo "  Example:"
  echo "    ./rbc load portal"
  echo "    ./rbc start device"
  echo "    ./rbc restart"
  exit 1
}

# Verbose logging
log() {
  if $debug; then
    echo "[DEBUG] $1"
  fi
}

# Command: load
load() {
  name="$1"
  if [ -z "$name" ]; then
    docker load -i asvin-rbc-portal.tar
    docker load -i asvin-rbc-device-service.tar
    docker load -i asvin-rbc-mongo.tar
  elif [ "$name" == "portal" ]; then
    docker load -i asvin-rbc-portal.tar
  elif [ "$name" == "device" ]; then
    docker load -i asvin-rbc-device-service.tar
  elif [ "$name" == "mongo" ]; then
    docker load -i asvin-rbc-mongo.tar
  else 
    echo "Unknow image name"
  fi
}

# Command: start
up() {
  name="$1"
  if [ -z "$name" ]; then
    docker compose up -d
  elif [ "$name" == "portal" ]; then
    docker compose up asvin-rbc-portal -d
  elif [ "$name" == "device" ]; then
    docker compose up asvin-rbc-device-service -d
  elif [ "$name" == "mongo" ]; then
    docker compose up asvin-rbc-mongo -d
  else 
    echo "Unknow service name"
  fi
}

# Command: stop
down() {
  name="$1"
  if [ -z "$name" ]; then
    docker compose down
  elif [ "$name" == "portal" ]; then
    docker compose down asvin-rbc-portal
  elif [ "$name" == "device" ]; then
    docker compose down asvin-rbc-device-service
  elif [ "$name" == "mongo" ]; then
    docker compose down asvin-rbc-mongo
  else
    echo "Unknow service name"
  fi
}

# Command: restart
restart() {
  name="$1"
  if [ -z "$name" ]; then
    docker compose down && docker compose up -d
  elif [ "$name" == "portal" ]; then
    docker compose down asvin-rbc-portal && docker compose up asvin-rbc-portal -d
  elif [ "$name" == "device" ]; then
    docker compose down asvin-rbc-device-service && docker compose up asvin-rbc-device-service -d
  elif [ "$name" == "mongo" ]; then
    docker compose down asvin-rbc-mongo &&  docker compose up asvin-rbc-mongo -d
  else 
    echo "Unknow service name"
  fi
}

# Command: snapshot
snapshot() {
  #!/bin/bash
  set -a           # export all variables
  source .env
  set +a
  set -e

  BASE_API_URL="${RBC_API_URL}"
  USERNAME="${RBC_USER_EMAIL}"
  PASSWORD="${RBC_USER_PASSWORD}"

  if [[ -z "$USERNAME" || -z "$PASSWORD" ]]; then
    echo "Login variables not provided!"
    exit 1
  fi

  # Get access token
  token_response=$(curl -s -X POST "$BASE_API_URL/Token" \
    -H "Content-Type: application/json" \
    -d "{\"username\": \"$USERNAME\", \"password\": \"$PASSWORD\"}")

  token=$(echo "$token_response" | jq -r '.Token')

  if [[ "$token" == "null" || -z "$token" ]]; then
    echo "Error generating access token!"
    echo "$token_response"
    exit 1
  fi

  echo "Token generation successful."

  # Create snapshots
  for typ in segment facility location; do
    snapshot_response=$(curl -s -X POST "$BASE_API_URL/Snapshot/$typ" \
      -H "Authorization: Bearer $token")

    success=$(echo "$snapshot_response" | jq -r '.IsSuccess')

    if [[ "$success" == "true" ]]; then
      echo "$typ snapshot created successfully: $success"
    else
      echo "Error snapshot creation for $typ!"
      echo "$snapshot_response"
    fi
  done
}


# Command: upgrade
upgrade() {
  load "$@"
  restart "$@"
}

# Parse options
while getopts ":hvd" opt; do
  case $opt in
    h) usage ;;
    v) 
      echo "${version}" 
      exit 0
      ;;
    d) debug=true ;;
    \?)
      echo "$0: unrecognized option: '$OPTARG' in ${!OPTIND}" >&2
      echo ""
      echo "Usage:  $0 [OPTIONS] COMMAND [ARGS]"
      echo ""
      echo "Run '$0 -h' for more information"
      exit 1
      ;;
    # *) usage ;;
  esac
done

verify_compose_file(){
  if [[ ! -f "docker-compose.yml" ]]; then
    echo "$0: docker-compose.yml not found." >&2
    exit 1
  fi
}

# Shift positional arguments
shift $((OPTIND - 1))

# Check if command is provided
command="$1"
shift || true

case "$command" in
  load)
    load "$@"
    ;;
  ps)
    verify_compose_file
    docker compose ps -a
    ;;
  up)
    verify_compose_file
    up "$@"
    ;;
  down)
    verify_compose_file
    down "$@"
    ;;
  restart)
    verify_compose_file
    restart "$@"
    ;;
  upgrade)
    verify_compose_file
    upgrade "$@"
    ;;
  snapshot)
    snapshot
    ;;
  *)
    echo "$0: unknown command: $command"
    echo ""
    echo "Run '$0 -h' for more information"
    exit 1
    ;;
esac
