#!/bin/bash
#
# This is a trivial "compiler" for JTalk code. Run without arguments for help.

# Get JTalk root directory from the location of this script.
JTALK=`dirname ${0}`/..

USAGE="Usage: $0 [-r] file1 file2 ... file3 Program

   Will compile a JTalk program into a single javascript file called
   Program.js (last argument) by concatenating listed files using these rules:

     *.js files are concatenated as is. If not found we look in $JTALK/js

     *.st files are compiled into .js files. If not found we look in $JTALK/st.
     Each file is considered to be a fileout of a single class category of
     the same name as the file.

     NOTE: boot.js and Kernel.js is always added first and init.js
     is always added last. Finally main.js is added if found.

     If -r is used we also run node with the resulting Program.js.
"

if [ "$#" == "0" ]; then
	echo "$USAGE"
	exit 1
fi

if [ $1 == "-r" ]; then
  RUN=true
  shift
fi

# Get a unique tempdir and make sure it gets nuked later
TMPDIR=`mktemp -d`
trap "rm -rf $TMPDIR" EXIT

# Collect libraries and Smalltalk files
until [ "$*" = "" ]
do
  case $1 in
     *.st)
        CATEGORY=`basename $1 .st`
        if [ -f "$1" ]; then
           COMPILE="$COMPILE $1 $CATEGORY"
           COMPILED="$COMPILED $CATEGORY.js"
        else
           if [ -f $JTALK/st/$1 ]; then
             COMPILE="$COMPILE $JTALK/st/$1 $CATEGORY"
             COMPILED="$COMPILED $CATEGORY.js"
           else
             echo "JTalk file not found: $1"
           fi
        fi
        shift
        ;;

     *.js)
        if [ -f "$1" ]; then
           LIBS="$LIBS $1" 
        else
           if [ -f $JTALK/js/$1 ]; then
             LIBS="$LIBS $JTALK/js/$1"
           else
             echo "Javascript file not found: $1"
           fi
        fi
        ;;
  esac
  # Will end up being the last argument
  PROGRAM=$1
  shift
done

# Create compiler dynamically
cat $JTALK/js/boot.js $JTALK/js/Kernel.js $JTALK/js/Parser.js $JTALK/js/Compiler.js $JTALK/js/init.js $JTALK/nodejs/nodecompile.js > $TMPDIR/compiler-all.js

# Compile all collected .st files to .js
node $TMPDIR/compiler-all.js $COMPILE

# Verify all .js files corresponding .st files were created, otherwise exit
IFS=" "
for FILE in $COMPILED
do
  if [ ! -f "$FILE" ]; then
    echo "Failed compilation of $FILE, exiting."
    exit 1
  fi 
done

# Compose the complete libs.js file from collected .js filenames.
if [ -n "$LIBS" ]; then
  echo "LIBS $LIBS"
  cat $LIBS > $TMPDIR/libs.js
  LIBS=$TMPDIR/libs.js
fi

# Check for main.js
if [ -f "main.js" ]; then
  MAIN="main.js"
fi

# And finally concatenate Program.js
cat $JTALK/js/boot.js $JTALK/js/Kernel.js $LIBS $COMPILED $JTALK/js/init.js $MAIN > $PROGRAM.js

# Optionally run Program and give all args left to it
if [ -n "$RUN" ]; then
  echo "Running program"
  echo "---------------"
  node $PROGRAM.js $@
fi