#!/bin/sh

########################################################## 
#               Gridworks Control System                 #
##########################################################

fail () {
   cat <<EOF
ERROR: $1
Type '$0 -h' for usage information.
EOF
exit 1
}

error() {
    echo "$1"
    exit 1
}

usage() {
    cat <<EOF
Usage: $0 [options] <action>
where [options] include:

  -h print this message and exit
  
  -p <port> the port that gridworks will listen to
     default: 3333

  -i <interface> the host interface gridworks should bind to
     default: 127.0.0.1

  -w <path> path to the webapp
     default: src/main/webapp

  -d <path> path to the data directory
     default: OS dependent
          
  --debug enable JVM debugging (on port 8000)
       
  --jmx enable JMX monitoring (for jconsole)
  
and <action> is one of

   build ..................... Build Gridworks      
   run ....................... Run Gridworks
   
   make_dmg <version> ........ Make MacOSX DMG distribution
   make_exe <version> ........ Make Windows EXE distribution

   clean ..................... Clean compiled classes
   distclean ................. Remove all generated files
                
EOF
    exit 1
}

add_option() {
  OPTS="$OPTS $1"
}

OPTS="$GRIDWORKS_OPTS"

# Normalize the current directory
cd `dirname $0`

SYSTEM=`uname`

if [ "$SYSTEM" == "Darwin" ] && [ "$JAVA_HOME" == "" ] ; then
    export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home"
fi
        
# ----- actions -------------------------------------------------

check_macosx() {
    if [ "$SYSTEM" != 'Darwin' ] ; then
        error "This action can only run on MacOSX"
    fi
}
    
ant_prepare() {
    if [ ! -d $GRIDWORKS_BUILD_DIR ] ; then 
        mkdir $GRIDWORKS_BUILD_DIR || exit 1
    fi
    
    ANT=`which ant`
    if [ "$ANT" = "" ] ; then
        cd thirdparty
        ANT_TAR=`ls | grep apache-ant | grep tar.gz | grep -v svn`
        ANT_DIR=`echo $ANT_TAR | sed 's/.tar.gz//'`
        if [ ! -d $ANT_DIR ] ; then
            tar xzf $ANT_TAR -C . || exit 1
        fi
        ANT="`pwd`/$ANT_DIR/bin/ant"
        cd ..
    fi
}

ant() {
    ant_prepare   
    echo $NUM_VERSION 
    $ANT -f build.xml -Dbuild.dir="$GRIDWORKS_BUILD_DIR" -Ddist.dir="$GRIDWORKS_DIST_DIR" -Dversion="$VERSION" -Dnum_version="$NUM_VERSION" -Djava.options="$JAVA_OPTIONS" $1 || exit 1
}

dist_prepare() {
    if [ ! -d $GRIDWORKS_DIST_DIR ] ; then 
        mkdir $GRIDWORKS_DIST_DIR || exit 1
    fi
}
       
launch4j_prepare() {
    cd thirdparty
    LAUNCH4J_TAR=`ls | grep launch4j | grep tar.gz | grep -v svn`
    LAUNCH4J_DIR="thirdparty/launch4j"
    if [ ! -d "$LAUNCH4J_DIR" ] ; then
        tar xzf $LAUNCH4J_TAR -C thirdparty || exit 1
    fi
    cd ..
}

protobuf_prepare() {
    cd thirdparty
    PROTOBUF_TAR=`ls | grep protobuf | grep tar.gz | grep -v svn`
    PROTOBUF_DIR=`echo $PROTOBUF_TAR | sed 's/.tar.gz//'`
    PROTOC="`pwd`/$PROTOBUF_DIR/bin/protoc"
    if [ ! -f $PROTOC ] ; then
        tar xzf $PROTOBUF_TAR -C . || exit 1
        cd $PROTOBUF_DIR
        ./configure --prefix=`pwd`
        make
        make install
        cd ..
    fi
    PROTOC="`pwd`/$PROTOBUF_DIR/bin/protoc"
    cd ..
}

get_version() {
    VERSION=$1        
    
    if [ "$VERSION" == "" ] ; then
        fail "Must specify a version number"
    fi
    
    NUM_VERSION=`echo $VERSION | sed 's/[a-zA-Z]//g'`
}
    
make_exe() {
    check_macosx
    dist_prepare
    launch4j_prepare
    get_version $1
    
    ant exe
}
    
make_dmg() {
    check_macosx
    dist_prepare
    get_version $1
    
    ant bundle

    mkdir "$GRIDWORKS_BUILD_DIR/bundle/.background"
    cp src/graphics/dmg_background/dmg_background.png "$GRIDWORKS_BUILD_DIR/bundle/.background/dmg_background.png"
    
    SIZE=30
    
    TITLE="Gridworks $VERSION"
    echo "Building MacOSX DMG for $TITLE"
    hdiutil create -srcfolder "$GRIDWORKS_BUILD_DIR/bundle" -volname "$TITLE" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${SIZE}m "$GRIDWORKS_BUILD_DIR/temp_gridworks.dmg"
    DEVICE=$(hdiutil attach -readwrite -noverify -noautoopen "$GRIDWORKS_BUILD_DIR/temp_gridworks.dmg" | egrep '^/dev/' | sed 1q | awk '{print $1}')
    hdiutil attach "$GRIDWORKS_BUILD_DIR/temp_gridworks.dmg"
    
    echo '
       tell application "Finder"
         tell disk "'$TITLE'"
            open
            set current view of container window to icon view
            set toolbar visible of container window to false
            set statusbar visible of container window to false
            set the bounds of container window to {200, 100, 760, 460}
            set theViewOptions to the icon view options of container window
            set arrangement of theViewOptions to not arranged
            set icon size of theViewOptions to 100
            set background picture of theViewOptions to file ".background:'dmg_background.png'"
            make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
            set position of item "'Gridworks'" of container window to {170, 175}
            set position of item "Applications" of container window to {380, 175}
            close
            open               
            update without registering applications
            delay 2
            eject
         end tell
       end tell
    ' | osascript    
    
    chmod -Rf go-w /Volumes/Gridworks
    sync
    sync
    hdiutil detach $DEVICE
    hdiutil convert "$GRIDWORKS_BUILD_DIR/temp_gridworks.dmg" -format UDZO -imagekey zlib-level=9 -o "$GRIDWORKS_DIST_DIR/gridworks-$VERSION.dmg"
    hdiutil internet-enable -yes "$GRIDWORKS_DIST_DIR/gridworks-$VERSION.dmg"
    rm -f "$GRIDWORKS_BUILD_DIR/temp_gridworks.dmg"
}

run() {
    if [ ! -d $GRIDWORKS_BUILD_DIR/classes ] ; then
        ant build
        echo ""
    fi

    if [ "$SYSTEM" == 'Darwin' ] ; then
        OPTS="-Xdock:name=Gridworks -Xdock:icon=src/graphics/icon/gridworks.icns $OPTS"
    fi
    
    if [ "$GRIDWORKS_DATA_DIR" != "" ] ; then
        OPTS="-Dgridworks.data_dir=$GRIDWORKS_DATA_DIR $OPTS"
    fi
    
    CLASSPATH="$GRIDWORKS_BUILD_DIR/classes:$GRIDWORKS_LIB_DIR/*"

    RUN_CMD="$JAVA -cp $CLASSPATH $OPTS com.metaweb.gridworks.Gridworks"
  
    echo "Starting Gridworks at 'http://${GRIDWORKS_HOST}:${GRIDWORKS_PORT}/'"
    echo ""
    #echo "$RUN_CMD"
    #echo ""

    exec $RUN_CMD
}
    
# ----- We called without arguments print the usage -------------

[ $# -gt 0 ] || usage

# ----- Normalize the current directory -------------------------

cd `dirname $0`

# ----- Make sure there is a java environment installed -------------------------
    
if [ ! -z "$JAVA_HOME" ] ; then
    JAVA="$JAVA_HOME/bin/java"
else 
    JAVA=`which java`
    if [ -z "$JAVA" ] ; then
        if [ "$SYSTEM" = 'Darwin' ] ; then
            JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
        else
            error "The 'java' command should be in your path or the 'JAVA_HOME' environment variable should be set"
        fi
    fi
fi

JAVA_VERSION=`java -version 2>&1 | grep version | cut -d ' ' -f 3 | egrep ^\"1.6`
if [ -z "$JAVA_VERSION" ] ; then
    error "Gridworks requires java version 6 or later."
fi

# ----- Parse the command line args ------------------------------------------

while [ $# -ne 0 ] ; do
  case "$1" in
    -p) shift; GRIDWORKS_PORT="$1"; shift; continue;;
    -i) shift; GRIDWORKS_HOST="$1"; shift; continue;;
    -w) shift; GRIDWORKS_WEBAPP="$1"; shift; continue;;
    -d) shift; GRIDWORKS_DATA_DIR="$1"; shift; continue;;
    --debug) shift; add_option '-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n'; continue;;
    --jmx) shift; add_option '-Dcom.sun.management.jmxremote'; continue;;
    -*) fail "Invalid option: $1";;
    *) break;;
  esac
done

ACTION=$1; shift

# ----- Verify and Set Required Environment Variables -------------------------

if [ "$JAVA_OPTIONS" == "" ] ; then
  JAVA_OPTIONS="-Xms256M -Xmx1024M -XX:+UseLargePages -XX:+UseParallelGC"
fi
add_option "$JAVA_OPTIONS"

if [ "$GRIDWORKS_PORT" == "" ] ; then
    GRIDWORKS_PORT="3333"
fi
add_option "-Dgridworks.port=$GRIDWORKS_PORT"

if [ "$GRIDWORKS_HOST" == "" ] ; then
    GRIDWORKS_HOST="127.0.0.1"
fi
add_option "-Dgridworks.host=$GRIDWORKS_HOST"

if [ "$GRIDWORKS_WEBAPP" == "" ] ; then
    GRIDWORKS_WEBAPP="src/main/webapp"
fi
add_option "-Dgridworks.webapp=$GRIDWORKS_WEBAPP"

if [ "$GRIDWORKS_BUILD_DIR" == "" ] ; then
    GRIDWORKS_BUILD_DIR="build"
fi

if [ "$GRIDWORKS_LIB_DIR" == "" ] ; then
    GRIDWORKS_LIB_DIR="lib"
fi

if [ "$GRIDWORKS_DIST_DIR" == "" ] ; then
    GRIDWORKS_DIST_DIR="dist"
fi

# ----- Respond to the action given --------------------------------------------

case "$ACTION" in

  build)
    ant build;;

  bundle)
    ant bundle;;

  clean)
    ant clean;;

  distclean)
    ant distclean;;

  run) 
    run;;  
    
  make_dmg)
    make_dmg $1;;

  make_exe)
    make_exe $1;;
      
  *)
    usage; ;;
esac