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