#!/bin/bash

SRCDIR="javatx-src/main/java"
DESTDIR="out/src"
TESTDESTDIR="out/tests"
DEPENDENCIES="dependencies/*"
JAVAC_FLAGS="-g:none -nowarn"
JAVATX_COMPILER_PATH="JavaTXcompiler.jar"
COMPILED_CLASSES="lib/classes"

#remove all files, if the script is called with parameter "clear"
if [ "$1" = "clean" ]; then
    rm -r "$DESTDIR"
    exit 0
fi

if [ "$1" != "debug" ] && [ "$1" != "" ]; then
  echo "invalid argument: $1"
  exit 1
fi

#find all .java/.jav files and store paths in an array
#note: somehow absolute paths don't work correctly with find -newer
#JAVA_FILES=($(find "$SRCDIR" -name "*.java" -exec realpath {} \;))
#JAV_FILES=($(find "$SRCDIR" -name "*.jav" -exec realpath {} \;))
JAVA_FILES=($(find "$SRCDIR" -name "*.java"))
JAV_FILES=($(find "$SRCDIR" -name "*.jav"))


#create empty arrays for .class file paths
JAVA_CLASSES=()
JAV_CLASSES=()

JAVA_CHANGED=()
JAV_CHANGED=()

mkdir -p $DESTDIR

#fill class files arrays by subsituting .java/.jav -> .class for each file
for file in "${JAVA_FILES[@]}"; do
    #substitute destination dir with source dir
    class_name="$DESTDIR${file#$SRCDIR}"
    #substitute *.java -> *.class
    class_name="${class_name%.java}.class"
    #if .class file does not exists or .class file older than .java file
    if [ ! -f "$class_name" ] || [ "$(find "$file" -prune -newer "$class_name")" ]; then
        JAVA_CHANGED+=("$file")
        JAVA_CLASSES+=("$class_name")
    fi
done


for file in "${JAV_FILES[@]}"; do
    #substitute destination dir with source dir
    class_name="$DESTDIR${file#$SRCDIR}"
    #substitute *.jav -> *.class
    class_name="${class_name%.jav}.class"
    #if .class file does not exists or .class file older than .jav file
    if [ ! -f "$class_name" ] || [ "$(find "$file" -prune -newer "$class_name")" ]; then
        JAV_CHANGED+=("$file")
        JAV_CLASSES+=("$class_name")
    fi
done

if [ "$1" == "debug" ]; then
  echo "-d \"$(realpath $DESTDIR)\" -cp \"$(realpath $SRCDIR):$(realpath $DESTDIR):$(realpath $COMPILED_CLASSES)\" $(realpath ${JAV_CHANGED[@]})"
  exit 0
fi

if [ "${#JAV_CHANGED[@]}" -ne 0 ]; then
    echo "java -jar $JAVATX_COMPILER_PATH -d $DESTDIR -cp "$SRCDIR:$DEPENDENCIES:$COMPILED_CLASSES" ${JAV_CHANGED[@]}"
    java -jar $JAVATX_COMPILER_PATH -d $DESTDIR -cp "$SRCDIR:$DEPENDENCIES:$COMPILED_CLASSES" "${JAV_CHANGED[@]}"
    if [ $? -ne 0 ]; then
        echo "Fehler beim Kompilieren der Jav-Dateien. Beende das Skript."
        exit 1
    fi
fi

if [ "${#JAVA_CHANGED[@]}" -ne 0 ]; then
    echo "javac -d $DESTDIR -cp "$SRCDIR:$DESTDIR:$DEPENDENCIES" $JAVAC_FLAGS ${JAVA_CHANGED[@]}"
    javac -d $DESTDIR -cp "$SRCDIR:$DESTDIR:$DEPENDENCIES" $JAVAC_FLAGS "${JAVA_CHANGED[@]}"
fi

# if [ $? -eq 0 ]; then
#   ./test.sh
# fi