#!/usr/bin/env node

/*
    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 project
 *
 * USAGE
 *   ./create <path_to_new_project> <package_name> <project_name>
 *
 * EXAMPLE
 *  ./create ~/Desktop/radness org.apache.cordova.radness Radness
 */

var path = require('path');
var ConfigParser = require('cordova-common').ConfigParser;
var Api = require('../cordova/Api');


var argv = require('nopt')({
    'help' : Boolean,
    'cli' : Boolean,
    'shared' : Boolean, // alias for --link
    'link' : Boolean
}, { 'd' : '--verbose' });


var projectPath = argv.argv.remain[0];

if (argv.help || !projectPath) {
    console.log('Usage: $0 [--link] [--cli] <path_to_new_project> <package_name> <project_name> [<project_template_dir>]');
    console.log('   --link (optional): Link directly against the shared copy of the CordovaLib instead of a copy of it.');
    console.log('   --cli (optional): Use the CLI-project template.');
    console.log('   <path_to_new_project>: Path to your new Cordova iOS project');
    console.log('   <package_name>: Package name, following reverse-domain style convention');
    console.log('   <project_name>: Project name');
    console.log('   <project_template_dir>: Path to project template (override).');
    process.exit(0);
}
else {
    var config = new ConfigParser(path.resolve(__dirname, '../config.xml'));

    // apply overrides (package and project names
    if (argv.argv.remain[1]) {
        config.setPackageName(argv.argv.remain[1]);
    }
    if (argv.argv.remain[2]) {
        config.setName(argv.argv.remain[2]);
    }

    var options = {
        cli: argv.cli,
        link: argv.link || argv.shared,
        customTemplate: argv.argv.remain[3]
    };

    Api.createPlatform(projectPath, config, options);
}

