#!/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 ConfigParser = require('cordova-common').ConfigParser;
var Api = require('../template/cordova/Api');

var argv = require('nopt')({
    'help': Boolean,
    'guid': String,
    'silent': Boolean,
    'verbose': Boolean
}, { 'd': '--verbose' });

if (argv.help || argv.argv.remain.length === 0) {
    console.log('Usage: create PathToProject [ PackageName [ AppName [ CustomTemplate ] ] ] [--guid=<GUID string>]');
    console.log('    PathToProject : The path to where you wish to create the project');
    console.log('    PackageName   : The namespace for the project (default is Cordova.Example)');
    console.log('    AppName       : The name of the application (default is CordovaAppProj)');
    console.log('    CustomTemplate: The path to project template overrides');
    console.log('                        (will be copied over default platform template files)');
    console.log('    --guid        : The App\'s GUID (default is random generated)');
    console.log('examples:');
    console.log('    create C:\\Users\\anonymous\\Desktop\\MyProject');
    console.log('    create C:\\Users\\anonymous\\Desktop\\MyProject io.Cordova.Example AnApp');
    process.exit(1);
}

var config = new ConfigParser(path.resolve(__dirname, '../template/config.xml'));

if (argv.argv.remain[1]) config.setPackageName(argv.argv.remain[1]);
if (argv.argv.remain[2]) config.setName(argv.argv.remain[2]);

var options = {
    guid: argv.guid,
    customTemplate: argv.argv.remain[3]
};

require('../template/cordova/lib/loggingHelper').adjustLoggerLevel(options);

Api.createPlatform(argv.argv.remain[0], config, options).done();
