#!/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 Api = require('./Api');
var nopt = require('nopt');
var path = require('path');

// Support basic help commands
if(['--help', '/?', '-h', 'help', '-help', '/help'].indexOf(process.argv[2]) >= 0) {
    console.log('');
    console.log('Usage: build [--debug | --release] [--phone | --win] [--bundle]');
    console.log('             [--archs="<list of architectures...>"');
    console.log('             [--packageCertificateKeyFile="key path"]');
    console.log('             [--packageThumbprint="thumbprint"] [--publisherId]');
    console.log('             [--buildConfig="file path"]');
    console.log('    --help                      : Displays this dialog.');
    console.log('    --debug                     : Builds project in debug mode. (Default).');
    console.log('    --release  (-r)             : Builds project in release mode.');
    console.log('    --phone, --win              : Specifies, what type of project to build.');
    console.log('    --bundle                    : Tells the compiler to create a .appxbundle.');
    console.log('                                  Bundling is disabled when `anycpu` is built.');
    console.log('    --archs                     : Builds project binaries for specific chip');
    console.log('                                  architectures (`anycpu`, `arm`, `x86`, `x64`).');
    console.log('                                  Separate multiple choices with spaces and if');
    console.log('                                  passing multiple choices, enclose with " ".');
    console.log('    --appx=<8.1-win|8.1-phone|uap|uwp>');
    console.log('                                : Overrides windows-target-version to build');
    console.log('                                  Windows 8.1, Windows Phone 8.1, or');
    console.log('                                  Windows 10 Universal.');
    console.log('    --packageCertificateKeyFile : Builds the project using provided certificate.');
    console.log('    --packageThumbprint         : Thumbprint associated with the certificate.');
    console.log('    --publisherId               : Sets publisher id field in manifest.');
    console.log('    --buildConfig               : Sets build settings from configuration file.');
    console.log('    --buildFlag                 : Sets build flag to pass to MSBuild (can be specified multiple times)');
    console.log('');
    console.log('examples:');
    console.log('    build ');
    console.log('    build --debug');
    console.log('    build --release');
    console.log('    build --release --archs="arm x86" --bundle');
    console.log('    build --appx=8.1-phone -r');
    console.log('    build --packageCertificateKeyFile="CordovaApp_TemporaryKey.pfx"');
    console.log('    build --publisherId="CN=FakeCorp, C=US"');
    console.log('    build --buildConfig="build.json"');
    console.log('    build --buildFlag="/clp:Verbosity=normal" --buildFlag="/p:myBuildProperty=Foo"');
    console.log('');

    process.exit(0);
}

// Do some basic argument parsing
var buildOpts = nopt({
    'silent' : Boolean,
    'verbose' : Boolean,
    'debug' : Boolean,
    'release' : Boolean,
    'nobuild': Boolean,
    'buildConfig' : path,
    'buildFlag': [String, Array]
}, { d : '--verbose', r: '--release' });

// Make buildOptions compatible with PlatformApi build method spec
buildOpts.argv = buildOpts.argv.original;

require('./lib/loggingHelper').adjustLoggerLevel(buildOpts);

new Api().build(buildOpts).done();
