#!/usr/bin/env node

/*
 *
 * Copyright 2013 Canonical Ltd.
 *
 * Licensed 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 args = process.argv;
var ROOT = path.join(__dirname, '..');
var fs    = require('fs');

function help() {
    console.log('Usage: ' + path.relative(process.cwd(), path.join(ROOT, 'bin', 'create')) + ' <path_to_new_project> <package_name> <project_name>');
    console.log('    <path_to_new_project>: Path to your new Cordova Ubuntu project');
    console.log('    <package_name>: Package name');
    console.log('    <project_name>: Project name');
    process.exit(0);
}

function create(project_path, package_name, project_name, project_template_dir) {
    function create_project() {
        var shell = require("shelljs");
        // Check if project already exists
        if(fs.existsSync(project_path)) {
            console.error('Project already exists! Delete and recreate');
            process.exit(2);
        }
        shell.mkdir(project_path);
        shell.cp('-r', path.join(ROOT, '*'), path.join(project_path, 'build'));
        shell.mkdir(path.join(project_path, 'armhf'));
        shell.mkdir(path.join(project_path, 'native'));
        shell.cp('-r', path.join(ROOT, 'bin/build/*'), path.join(project_path, 'cordova'));

        shell.cp('-r', path.join(ROOT, 'bin/node_modules'), path.join(project_path, 'cordova'));

        shell.cp('-r', path.join(ROOT, 'xml/config.xml'), project_path);

        shell.cd(project_path);
    }

    try {
        require.resolve("shelljs");
        require.resolve("elementtree");
        require.resolve("colors");
        create_project();
    } catch(e) {
        console.log('Shelljs module was not found, running \'npm install\'.....');
        var exec = require('child_process').exec;
        var cwd = process.cwd();

        var block = true;
        exec('npm install', {cwd: __dirname}, function (error, stdout, stderr) {
            block = false;
            if (error !== null) {
                console.error('ERROR : running \'npm install\' is npm installed? ' + error);
                console.error(stderr);
                process.exit(error.code);
            }
        });
        function wait() {
            if (block)
                setTimeout(wait, 1500);
            else
                create_project();
        };
        setTimeout(wait, 1500);
    }
}

if(args.length < 3 || (args[2] == '--help' || args[2] == '/?' || args[2] == '-h' ||
                       args[2] == 'help' || args[2] == '-help' || args[2] == '/help')) {
    help();
} else {
    create(args[2], args[3], args[4], args[5]);
}
