#!/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.


# Script creates a mobilespec project that uses all local repositories.
# It currently installs only the iOS and Android platforms.
# Based on: https://wiki.apache.org/cordova/WorkingWithThree#preview

# TODO: Remove once CLI/plugman moves away from shelljs.exec().
ulimit -S -n 4096

if [[ ! -d cordova-mobile-spec ]]; then
  echo "Please run this script from the directory that contains cordova-mobile-spec"
  exit 1
fi

if [[ -e mobilespec ]]; then
  echo "Directory \"mobilespec\" already exists. Delete it first then re-run."
  exit 1
fi

echo "Creating mobilespec project. If you have any errors, it may be from missing repositories."
echo "To clone needed repositories:"
echo "  ./cordova-coho/coho repo-clone -r plugins -r mobile-spec -r android -r ios -r cli"
echo "To update all repositories:"
echo "  ./cordova-coho/coho repo-update -r auto"
REPO_PARENT="$PWD"
set -e

./cordova-cli/bin/cordova create mobilespec org.apache.mobilespec mobilespec
( cd cordova-js; grunt )
cd mobilespec
echo '{
  "id":"org.apache.mobilespec",
  "name":"mobilespec",
  "lib": {
    "android": {
      "uri": "'"$REPO_PARENT/cordova-android"'",
      "version": "dev",
      "id": "cordova-android-dev"
    },
    "ios": {
      "uri": "'"$REPO_PARENT/cordova-ios"'",
      "version": "dev",
      "id": "cordova-ios-dev"
    }
  }
}' > .cordova/config.json

set -x
../cordova-cli/bin/cordova platform add ios android
../cordova-cli/bin/cordova plugin add ../cordova-mobile-spec/dependencies-plugin
rm -r www
ln -s ../cordova-mobile-spec www
rm -rf platforms/ios/CordovaLib
../cordova-ios/bin/update_cordova_subproject platforms/ios/mobilespec.xcodeproj
../cordova-cli/bin/cordova prepare
cp ../cordova-js/pkg/cordova.android.js platforms/android/assets/www/cordova.js
cp ../cordova-js/pkg/cordova.ios.js platforms/ios/www/cordova.js
ln -s ../cordova-cli/bin/cordova cordova

set +x
echo "App created in the mobilespec/ directory."
echo "Symlink to CLI created as mobilespec/cordova"



