#! /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 [ -z "$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 1
}

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
