#! /bin/bash
#       Licensed to the Apache Software Foundation (ASF) under one
#       or more contributor license agreements.  See the NOTICE file
#       distributed with this work for additional information
#       regarding copyright ownership.  The ASF licenses this file
#       to you under the Apache License, Version 2.0 (the
#       "License"); you may not use this file except in compliance
#       with the License.  You may obtain a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#       Unless required by applicable law or agreed to in writing,
#       software distributed under the License is distributed on an
#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#       KIND, either express or implied.  See the License for the
#       specific language governing permissions and limitations
#       under the License.
#
# create a cordova/android project
# 
# USAGE
#   ./create [path package activity]
#
set -e

if [ -n "$1" ] && [ "$1" == "-h" ]
then
    echo 'usage: create path package activity'
    echo "Make sure the Android SDK tools folder is in your PATH!"
    exit 0
fi

BUILD_PATH="$( cd "$( dirname "$0" )/.." && pwd )"
VERSION=$(cat "$BUILD_PATH"/VERSION)

PROJECT_PATH="${1:-'./example'}"
PACKAGE=${2:-"org.apache.cordova.example"}
ACTIVITY=${3:-"cordovaExample"}

# clobber any existing example
if [ -d "$PROJECT_PATH" ]
then
    echo "Project already exists! Delete and recreate"
    exit 1
fi

# cleanup after exit and/or on error
function on_exit {
    # [ -f "$BUILD_PATH"/framework/libs/commons-codec-1.6.jar ] && rm "$BUILD_PATH"/framework/libs/commons-codec-1.6.jar
    # [ -d "$BUILD_PATH"/framework/libs ] && rmdir "$BUILD_PATH"/framework/libs
    if [ -f "$BUILD_PATH"/framework/assets/www/cordova-$VERSION.js ]
    then
        rm "$BUILD_PATH"/framework/assets/www/cordova-$VERSION.js
    fi
    if [ -f "$BUILD_PATH"/framework/cordova-$VERSION.jar ]
    then
        rm "$BUILD_PATH"/framework/cordova-$VERSION.jar
    fi
}

function createAppInfoJar {
    (cd "$BUILD_PATH"/bin/templates/cordova/ApplicationInfo &&
     javac ApplicationInfo.java &&
     jar -cfe ../appinfo.jar ApplicationInfo ApplicationInfo.class
    )
}

function on_error {
    echo "An unexpected error occurred: $previous_command exited with $?"
    echo "Deleting project..."
    [ -d "$PROJECT_PATH" ] && rm -rf "$PROJECT_PATH"
    exit "$?"
}

function replace {
    local pattern=$1
    local filename=$2
    # Mac OS X requires -i argument
    if [[ "$OSTYPE" =~ "darwin" ]]
    then
        /usr/bin/sed -i '' -e $pattern "$filename"
    elif [[ "$OSTYPE" =~ "linux" ]]
    then
        /bin/sed -i -e $pattern "$filename"
    fi
}

# we do not want the script to silently fail
trap 'previous_command=$this_command; this_command=$BASH_COMMAND' DEBUG
trap on_error ERR
trap on_exit EXIT

ANDROID_BIN="${ANDROID_BIN:=$( which android )}"
PACKAGE_AS_PATH=$(echo $PACKAGE | sed 's/\./\//g')
ACTIVITY_PATH="$PROJECT_PATH"/src/$PACKAGE_AS_PATH/$ACTIVITY.java
MANIFEST_PATH="$PROJECT_PATH"/AndroidManifest.xml

TARGET=$("$ANDROID_BIN" list targets | grep id: | tail -1 | cut -f 2 -d ' ' )
API_LEVEL=$("$ANDROID_BIN" list target | grep "API level:" | tail -n 1 | cut -f 2 -d ':' | tr -d ' ')

# if this a distribution release no need to build a jar
if [ ! -e "$BUILD_PATH"/cordova-$VERSION.jar ] && [ -d "$BUILD_PATH"/framework ]
then
# update the cordova-android framework for the desired target
    "$ANDROID_BIN" update project --target $TARGET --path "$BUILD_PATH"/framework &> /dev/null

    if [ ! -e "$BUILD_PATH"/framework/libs/commons-codec-1.7.jar ]; then
        # Use curl to get the jar (TODO: Support Apache Mirrors)
        curl -OL http://archive.apache.org/dist/commons/codec/binaries/commons-codec-1.7-bin.zip &> /dev/null
        unzip commons-codec-1.7-bin.zip &> /dev/null
        mkdir -p "$BUILD_PATH"/framework/libs
        cp commons-codec-1.7/commons-codec-1.7.jar "$BUILD_PATH"/framework/libs
        # cleanup yo
        rm commons-codec-1.7-bin.zip && rm -rf commons-codec-1.7
    fi

# compile cordova.js and cordova.jar
    (cd "$BUILD_PATH"/framework && ant jar &> /dev/null )
fi

# create new android project
"$ANDROID_BIN" create project --target $TARGET --path "$PROJECT_PATH" --package $PACKAGE --activity $ACTIVITY &> /dev/null

# copy project template
cp -r "$BUILD_PATH"/bin/templates/project/assets "$PROJECT_PATH"
cp -r "$BUILD_PATH"/bin/templates/project/res "$PROJECT_PATH"

# copy cordova.js, cordova.jar and res/xml
if [ -d "$BUILD_PATH"/framework ]
then
    cp -r "$BUILD_PATH"/framework/res/xml "$PROJECT_PATH"/res
    cp "$BUILD_PATH"/framework/assets/www/cordova-$VERSION.js "$PROJECT_PATH"/assets/www/cordova-$VERSION.js
    cp "$BUILD_PATH"/framework/cordova-$VERSION.jar "$PROJECT_PATH"/libs/cordova-$VERSION.jar
else
    cp -r "$BUILD_PATH"/xml "$PROJECT_PATH"/res/xml
    cp "$BUILD_PATH"/cordova-$VERSION.js "$PROJECT_PATH"/assets/www/cordova-$VERSION.js
    cp "$BUILD_PATH"/cordova-$VERSION.jar "$PROJECT_PATH"/libs/cordova-$VERSION.jar
fi

# interpolate the activity name and package
cp "$BUILD_PATH"/bin/templates/project/Activity.java "$ACTIVITY_PATH"
replace "s/__ACTIVITY__/${ACTIVITY}/g" "$ACTIVITY_PATH"
replace "s/__ID__/${PACKAGE}/g" "$ACTIVITY_PATH"

cp "$BUILD_PATH"/bin/templates/project/AndroidManifest.xml "$MANIFEST_PATH"
replace "s/__ACTIVITY__/${ACTIVITY}/g" "$MANIFEST_PATH"
replace "s/__PACKAGE__/${PACKAGE}/g" "$MANIFEST_PATH"
replace "s/__APILEVEL__/${API_LEVEL}/g" "$MANIFEST_PATH"

# creating cordova folder and copying run/build/log/launch scripts
mkdir "$PROJECT_PATH"/cordova
createAppInfoJar
cp "$BUILD_PATH"/bin/templates/cordova/appinfo.jar "$PROJECT_PATH"/cordova/appinfo.jar
cp "$BUILD_PATH"/bin/templates/cordova/cordova "$PROJECT_PATH"/cordova/cordova
cp "$BUILD_PATH"/bin/templates/cordova/build "$PROJECT_PATH"/cordova/build
cp "$BUILD_PATH"/bin/templates/cordova/release "$PROJECT_PATH"/cordova/release
cp "$BUILD_PATH"/bin/templates/cordova/clean "$PROJECT_PATH"/cordova/clean
cp "$BUILD_PATH"/bin/templates/cordova/log "$PROJECT_PATH"/cordova/log
cp "$BUILD_PATH"/bin/templates/cordova/run "$PROJECT_PATH"/cordova/run
