#!/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.
*/
// var path = require('path');
// var create = require('./lib/create');
// var args = process.argv;

// // Support basic help commands
// if(args.length < 3 || (args[2] == '--help' || args[2] == '/?' || args[2] == '-h' ||
//                     args[2] == 'help' || args[2] == '-help' || args[2] == '/help')) {
//     console.log('Usage: ' + path.relative(process.cwd(), path.join(__dirname, 'create')) + ' <path_to_new_project> <package_name> <project_name>');
//     console.log('    <path_to_new_project>: Path to your new Cordova Browser project');
//     console.log('    <package_name>: Package name, following reverse-domain style convention');
//     console.log('    <project_name>: Project name');
//     process.exitCode = 1;
// } else {
//     create.createProject(args[2], args[3], args[4], args[5]);
// }

/*
 * 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('./template/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 configPath = path.resolve(__dirname, 'template/config.xml');
    var config = new ConfigParser(configPath);

    // 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);
}


