#!/usr/bin/env bash
set -euo pipefail

function usage()
{
   cat <<EOF
Usage: $0 [-d] [--classpath=<classpath>]

Position spawner files in ${spawn_dir}. Must run as sudo

Where:
       -d = dryrun (just display commands)
       --classpath = classpath that contains all the jars we will find our spawner files from.

 -? or -h or --help = show usage.
EOF
}

# Function to find the given jar (or root of a jar) in the classpath
function find_jar()
{
   local classpath="$1"
   local query="$2"

   local IFS=':'
   for entry in $classpath; do
      # Skip empty classpath elements
      [[ -z "$entry" ]] && continue

      # Only match actual files
      [[ -f "$entry" ]] || continue

      local base=$(basename "$entry")

      if [[ "$query" == *.jar ]]; then
         # Full file name match
         if [[ "$base" == "$query" ]]; then
            printf '%s\n' "$entry"
            return 0
         fi
      else
         # Root search: match "root-*.jar" or exactly "root.jar"
         if [[ "$base" == "$query".jar || "$base" == "$query"-*.jar ]]; then
            printf '%s\n' "$entry"
            return 0
         fi
      fi
   done

   return 1
}

# defaults
spawn_dir=/opt/spawner
srv_certs="srv-certs.store"
mycmd=""

while getopts ":h?d-:" opt; do
   case "$opt" in
      d  ) mycmd="echo" ;;
      -  ) case ${OPTARG} in
             "help" ) usage
                      exit 1 ;;
              "classpath="* ) cp=$(echo $OPTARG | cut -d "=" -f2) ;;
              * ) echo "Unknown option: --${OPTARG}"
                  usage
                  exit 1 ;;
           esac
           ;;
      h | \? ) if [[ "$OPTARG" == "?" || "$opt" == "h" ]]; then
                  usage
                  exit 1
               else
                  echo "Unknown option: -${OPTARG}"
                  usage
                  exit 1
               fi
               ;;
   esac
done
shift $(($OPTIND - 1))

P2J_JAR=$(find_jar "$cp" "p2j.jar")
if [[ $? -eq 0 ]]; then
    echo "Matched p2j.jar: $P2J_JAR"

    spawn_prog="${P2J_JAR%/lib/p2j.jar}/native/spawn"
    echo "Derived spawn path: $spawn_prog"
else
    echo "No matching p2j.jar found"
fi

ASPECTJ_RT=$(find_jar "$cp" "aspectjrt")
if [[ $? -eq 0 ]]; then
    echo "Matched aspectjrt: $ASPECTJ_RT"
else
    echo "No matching aspectjrt found"
fi

SLF4J_API=$(find_jar "$cp" "slf4j-api")
if [[ $? -eq 0 ]]; then
    echo "Matched slf4j-api: $SLF4J_API"
else
    echo "No matching slf4j-api found"
fi

echo "Installing..."
[ ! -d $spawn_dir ] && $mycmd mkdir -p $spawn_dir

if ! cmp -s "$spawn_prog" "${spawn_dir}/spawn"; then
   echo " spawn tool: $spawn_prog to ${spawn_dir}/spawn"
   $mycmd cp -f $spawn_prog ${spawn_dir}/spawn
fi

if ! cmp -s "$P2J_JAR" "${spawn_dir}/p2j.jar"; then
   echo " p2j.jar: ${P2J_JAR} to ${spawn_dir}/p2j.jar"
   $mycmd cp -f $P2J_JAR ${spawn_dir}/p2j.jar
   $mycmd chown root:root ${spawn_dir}/spawn ${spawn_dir}/p2j.jar
   $mycmd chmod 4755 ${spawn_dir}/spawn
   $mycmd chmod 0550 ${spawn_dir}/p2j.jar
fi

if [ -f "$ASPECTJ_RT" ]; then
   if ! cmp -s "$ASPECTJ_RT" "${spawn_dir}/aspectjrt.jar"; then
      echo " aspectj_rt: ${ASPECTJ_RT} to ${spawn_dir}/aspectjrt.jar"
      $mycmd cp -f $ASPECTJ_RT ${spawn_dir}/aspectjrt.jar
      $mycmd chown root:root ${spawn_dir}/aspectjrt.jar
      $mycmd chmod 0550 ${spawn_dir}/aspectjrt.jar
   fi
else
   echo "WARNING! The $ASPECTJ_RT file was not found."
fi

if [ -f "$SLF4J_API" ]; then
   if ! cmp -s "$SLF4J_API" "${spawn_dir}/slf4j-api.jar"; then
      echo " slf4j_api: ${SLF4J_API} to ${spawn_dir}/slf4j-api.jar"
      $mycmd cp -f $SLF4J_API ${spawn_dir}/slf4j-api.jar
      $mycmd chown root:root ${spawn_dir}/slf4j-api.jar
      $mycmd chmod 0550 ${spawn_dir}/slf4j-api.jar
   fi
else
   echo "WARNING! The $SLF4J_API file was not found."
fi

if [ -f "$srv_certs" ]; then
   if ! cmp -s "$srv_certs" "${spawn_dir}/srv-certs.store"; then
      echo " certificate file: $srv_certs to ${spawn_dir}/srv-certs.store"
      $mycmd cp -f $srv_certs ${spawn_dir}/srv-certs.store
      $mycmd chown root:root ${spawn_dir}/srv-certs.store
      $mycmd chmod 0550 ${spawn_dir}/srv-certs.store
   fi
else
   echo "WARNING! The $srv_certs file was not found."
fi
