#!/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.
*/

/*
 * create a Cordova project
 *
 * USAGE
 *   ./create <path_to_new_project> <package_name> <project_name>
 *
 * EXAMPLE
 *  ./create ~/Desktop/radness org.apache.cordova.radness Radness
 */

const path = require('path');
const ConfigParser = require('cordova-common').ConfigParser;
const Api = require('./templates/cordova/Api');

const argv = require('nopt')({
    help: Boolean,
    cli: Boolean,
    shared: Boolean, // alias for --link
    link: Boolean
}, { d: '--verbose' });

const 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 {
    const configPath = path.resolve(__dirname, 'templates/project/config.xml');
    const 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]);
    }

    const options = {
        cli: argv.cli,
        link: argv.link || argv.shared,
        customTemplate: argv.argv.remain[3]
    };

    Api.createPlatform(projectPath, config, options);
}
