#!/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).catch(err => {
    console.error(err);
    process.exit(2);
});
