#!/bin/bash
######################################
# THE Pi4J PROJECT - UTILITY SCRIPT
######################################

function checkJavaRuntime {
  JAVA_CMD=`which java`
  if [ $? -ne 0 ]; then
    echo "ERROR; The JAVA runtime was not found in the PATH on this system!"
    exit 1
  fi
}

function checkJavaCompiler {
  JAVAC_CMD=`which javac`
  if [ $? -ne 0 ]; then
    echo "ERROR; The JAVA compiler (SDK) was not found in the PATH on this system!"
    exit 1
  fi
}


# CHECK FOR MISSING CLI ARGUMENTS
if [ $# -eq 0 ]; then
  echo
  echo "------------------------------"
  echo "Pi4J Utility Script"
  echo "------------------------------"
  echo
  echo "No arguments supplied!"
  echo "Use 'pi4j --help' to display command options."
  echo
  exit 1;
fi

# HANDLE OPTIONAL ARGS
case $1 in
   '?') ;&
   -\?) ;&
   --\?) ;&
   -help) ;&
   --help)
      shift
      echo
      echo "------------------------------"
      echo "Pi4J Utility Script"
      echo "------------------------------"
      echo
      echo " USAGE: pi4j [OPTION]... (<FILE|CLASS|JAVA-ARGS>)"
      echo " (if no option is specified, the '--run' option is assumed)"
      echo
      echo " OPTIONS:"
      echo " --------"
      echo "  ?, --help               :  display this 'help' content"
      echo "  -v, --version           :  display Pi4J version"
      echo "  -u, --update            :  check for & install Pi4J updates"
      echo "  -U, --uninstall         :  uninstall Pi4J"
      echo "  -c, --compile  <FILE>   :  exec javac with pi4j in classpath"
      echo "  -r, --run      <CLASS>  :  exec java with pi4j in classpath"
      echo
      echo " EXAMPLES:"
      echo " ---------"
      echo "  pi4j --version                       (display Pi4J version)"
      echo "  pi4j --update                        (update Pi4J installation)"
      echo "  pi4j --uninstall                     (uninstall Pi4J package)"
      echo
      echo "  pi4j --compile HelloWorld.java       (compile 'HelloWorld.java' sources)"
      echo "  pi4j -c HelloWorld.java              (compile 'HelloWorld.java' sources)"
      echo
      echo "  pi4j --run HelloWorld                (run compiled 'HelloWorld' program)"
      echo "  pi4j -r HelloWorld                   (run compiled 'HelloWorld' program)"
      echo "  pi4j HelloWorld                      (run compiled 'HelloWorld' program)"
      echo
      echo
      ;;
   -v) ;&
   -version) ;&
   --version)
      shift
      echo
      echo "--------------------------------------------"
      echo "            THE Pi4J PROJECT"
      echo "--------------------------------------------"
      echo "   VERSION   : 1.2"
      echo "   TIMESTAMP : 2019-02-28 03:03:26"
      echo "--------------------------------------------"
      echo
      ;;
   -u) ;&
   -update) ;&
   --update)
      shift
      echo "--------------------------------------------"
      echo "Pi4J - UPDATE"
      echo "--------------------------------------------"
      sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/pi4j.list"  -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
      sudo apt-get install pi4j
      ;;
   -U) ;&
   -uninstall) ;&
   --uninstall)
      shift
      echo "--------------------------------------------"
      echo "Pi4J - UNINSTALL"
      echo "--------------------------------------------"
      read -p "Are you sure you want to uninstall Pi4J? <y/n> " -n 1 -r
      echo    # (optional) move to a new line
      if [[ $REPLY =~ ^[Yy]$ ]]; then
        sudo apt-get remove pi4j -y
      fi
      ;;
   -RI) ;&
   -reinstall) ;&
   --reinstall)
      shift
      echo "--------------------------------------------"
      echo "Pi4J - REINSTALL"
      echo "--------------------------------------------"
      read -p "Are you sure you want to reinstall Pi4J? <y/n> " -n 1 -r
      echo    # (optional) move to a new line
      if [[ $REPLY =~ ^[Yy]$ ]]; then
        sudo apt-get remove pi4j -y
        sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/pi4j.list"  -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
        sudo apt-get install pi4j -y
      fi
      ;;
   -c) ;&
   -compile) ;&
   --compile)
      shift
      echo "--------------------------------------------"
      echo "Pi4J - Compiling: $1"
      echo "--------------------------------------------"
      checkJavaCompiler
      set -x #echo on
      javac -classpath .:classes:'*':classes:/opt/pi4j/lib/'*' -d . $@
      ;;
   -r) ;&
   -run) ;&
   --run)
      shift
      PROGRAMNAME=$1; shift;
      echo "--------------------------------------------"
      echo "Pi4J - Launching: $PROGRAMNAME"
      echo "--------------------------------------------"
      checkJavaRuntime
      set -x #echo on
      java -classpath .:classes:'*':classes:/opt/pi4j/lib/'*' ${PROGRAMNAME/.java/} $@
      ;;
   *)
      if [[ $1 == *.java ]]; then
        # COMPILE SOURCE FILE
        echo "--------------------------------------------"
        echo "Pi4J - Compiling: $1"
        echo "--------------------------------------------"
        checkJavaCompiler
        set -x #echo on
        javac -classpath .:classes:'*':classes:/opt/pi4j/lib/'*' -d . $1
        set +x #echo off

        # CHECK FOR STATIC MAIN PROGRAM ENTRY IN SOURCE FILE
        if grep --quiet -F -i -m 1 'static void main' $1; then

          PACKAGE_NAME=;
          CLASS_NAME=;

          # CHECK FOR PACKAGE NAME IN SOURCE FILE
          if grep --quiet -F -i -m 1 'package' $1; then

            # GET PACKAGE NAME
            PACKAGE_NAME=`grep -F -i -m 1 'package' $1`

            # REMOVE PACKAGE DECLARATION
            PACKAGE_NAME=${PACKAGE_NAME#'package'}

            # REMOVE PACKAGE SEMICOLON (if exists)
            PACKAGE_NAME=${PACKAGE_NAME%';'}

            # TRIM SPACES
            PACKAGE_NAME="${PACKAGE_NAME#"${PACKAGE_NAME%%[![:space:]]*}"}"   # remove leading whitespace characters
            PACKAGE_NAME="${PACKAGE_NAME%"${PACKAGE_NAME##*[![:space:]]}"}"   # remove trailing whitespace characters

            # APPEND DOT SUFFIX CHARACTER
            PACKAGE_NAME="${PACKAGE_NAME}."
          fi

          # CHECK FOR CLASS NAME IN SOURCE FILE
          if grep --quiet -F -i -m 1 'public class' $1; then

            # GET CLASS NAME
            CLASS_NAME=`grep -F -i -m 1 'public class' $1`

            # REMOVE CLASS DECLARATION
            CLASS_NAME=${CLASS_NAME#'public class'}

            # REMOVE CLASS OPEN BRACE (if exists)
            CLASS_NAME=${CLASS_NAME%'{'}

            # TRIM SPACES
            CLASS_NAME="${CLASS_NAME#"${CLASS_NAME%%[![:space:]]*}"}"   # remove leading whitespace characters
            CLASS_NAME="${CLASS_NAME%"${CLASS_NAME##*[![:space:]]}"}"   # remove trailing whitespace characters

            # SHIFT FIRST CLI ARG OUT
            shift

            # LAUNCH COMPILED PROGRAM
            echo "--------------------------------------------"
            echo "Pi4J - Launching: $PACKAGE_NAME$CLASS_NAME"
            echo "--------------------------------------------"
            checkJavaRuntime
            set -x #echo on
            java -classpath .:classes:'*':classes:/opt/pi4j/lib/'*' $PACKAGE_NAME$CLASS_NAME $@
          fi
        fi
      else
        checkJavaRuntime
        set -x #echo on
        java -classpath .:classes:'*':classes:/opt/pi4j/lib/'*' $@
      fi
   ;;
esac
