#!/bin/bash
#
# Compiles code with DDC and runs the resulting code in node.js.
#
# The first script supplied should be the one with `main()`.
#
# Saves the output in the same directory as the sources for convenient
# inspection, modification or rerunning the code.
set -e

function follow_links() {
  file="$1"
  while [ -h "$file" ]; do
    file="$(readlink "$file")"
  done
  echo "$file"
}
PROG_NAME="$(follow_links "$BASH_SOURCE")"
SDK_DIR="$( cd "${PROG_NAME%/*}/../../.."; pwd -P)"

if [[ `uname` == 'Darwin' ]];
then
  OUT_DIR="$SDK_DIR"/xcodebuild
else
  OUT_DIR="$SDK_DIR"/out
fi

if [ -z "$DART_CONFIGURATION" ];
then
  DIRS=$( ls "$OUT_DIR" )
  # list of possible configurations in decreasing desirability
  CONFIGS=("ReleaseX64" "ReleaseIA32" "DebugX64" "DebugIA32"
    "ReleaseARM" "ReleaseARM64" "DebugARM" "DebugARM64")
  DART_CONFIGURATION="None"
  for CONFIG in ${CONFIGS[*]}
  do
    for DIR in $DIRS;
    do
      if [ "$CONFIG" = "$DIR" ];
      then
        # choose most desirable configuration that is available and break
        DART_CONFIGURATION="$DIR"
        break 2
      fi
    done
  done
  if [ "$DART_CONFIGURATION" = "None" ]
  then
    echo "No valid dart configuration found in $OUT_DIR"
    exit 1
  fi
fi

ROOT_OUT_DIR="$OUT_DIR"/"$DART_CONFIGURATION"
GEN_DIR="$ROOT_OUT_DIR"/gen/utils/dartdevc

KERNEL=false
if [ "$1" = "-k" ]; then
  KERNEL=true
  shift
fi

BASENAME=$( basename "${1%.*}")
LIBROOT=$(cd $( dirname "${1%.*}") && pwd)

if [ "$KERNEL" = true ]; then

  if [ ! -e $ROOT_OUT_DIR/ddc_sdk.dill ]; then
    echo "DDC SDK must be built first, please run:"
    echo "    pushd $SDKDIR"
    echo "    ./tools/build.py -m release dartdevc_kernel_sdk"
    exit 1
  fi

  NODE_PATH=$GEN_DIR/kernel/common:$LIBROOT:$NODE_PATH

  $SDK_DIR/sdk/bin/dartdevc --kernel --modules=node \
      --dart-sdk-summary=$ROOT_OUT_DIR/ddc_sdk.dill \
      -o $LIBROOT/$BASENAME.js $*
else

  if [ ! -e $GEN_DIR/ddc_sdk.sum ]; then
    echo "DDC SDK must be built first, please run:"
    echo "    pushd $SDKDIR"
    echo "    ./tools/build.py -m release dartdevc_sdk"
    exit 1
  fi

  NODE_PATH=$GEN_DIR/js/common:$LIBROOT:$NODE_PATH

  $SDK_DIR/sdk/bin/dartdevc --modules=node \
      --library-root=$LIBROOT --dart-sdk-summary=$GEN_DIR/ddc_sdk.sum \
      -o $LIBROOT/$BASENAME.js $*
fi

export NODE_PATH
pushd $LIBROOT > /dev/null
# TODO(jmesserly): we could have this output the same content as the devtool
# script, so you could debug the output without recompiling?
echo "
    let source_maps;
    try {
      source_maps = require('source-map-support');
      source_maps.install();
    } catch(e) {
    }
    let sdk = require(\"dart_sdk\");
    let main = require(\"./$BASENAME\").$BASENAME.main;
    try {
      sdk._isolate_helper.startRootIsolate(main, []);
    } catch(e) {
      if (!source_maps) {
        console.log('For Dart source maps: npm install source-map-support');
      }
      console.error(e);
      process.exit(1);
    }" \
    > $LIBROOT/$BASENAME.run.js
node $BASENAME.run.js || exit 1
popd > /dev/null
