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