#!/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.exit(1);
} else {
    create.createProject(args[2], args[3], args[4], args[5]);
}
