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

// Handle help flag
if (['--help', '/?', '-h', 'help', '-help', '/help'].indexOf(args[2]) > -1) {
    console.log('\nUsage: run [ --device | --emulator | --target=<id> ] [ --debug | --release | --nobuild ]');
    console.log('           [ --x86 | --x64 | --arm | --archs="list" ] [--bundle] [--phone | --win]');
    console.log('    --device      : Deploys and runs the project on the connected device.');
    console.log('    --emulator    : Deploys and runs the project on an emulator.');
    console.log('    --target=<id> : Deploys and runs the project on the specified target.');
    console.log('    --debug       : Builds project in debug mode.');
    console.log('    --release     : Builds project in release mode.');
    console.log('    --nobuild     : Uses pre-built package, or errors if project is not built.');
    console.log('    --archs       : Specific chip architectures (`anycpu`, `arm`, `x86`, `x64`).');
    console.log('                        Separate multiple choices with a space and, if choosing');
    console.log('                        multiple choices, enclose in quotes (").');
    console.log('    --bundle      : Generates an .appxbundle. Not valid if anycpu AND chip-specific');
    console.log('                    architectures are used.');
    console.log('    --phone, --win');
    console.log('                  : Specifies project type to deploy');
    console.log('    --appx=<8.1-win|8.1-phone|uap|uwp>');
    console.log('                  : Overrides windows-target-version to build Windows 8.1, ');
    console.log('                              Windows Phone 8.1, or Windows 10.');
    console.log('    --win10tools  : Uses Windows 10 deployment tools (used for a Windows 8.1 app when');
    console.log('                         being deployed to a Windows 10 device)');
    console.log('Examples:');
    console.log('    run');
    console.log('    run --emulator');
    console.log('    run --device');
    console.log('    run --target=7988B8C3-3ADE-488d-BA3E-D052AC9DC710');
    console.log('    run --device --release');
    console.log('    run --emulator --debug');
    console.log('    run --archs="x64 x86 arm" --no-bundle');
    console.log('    run --device --appx=phone-8.1');
    console.log('    run --device --archs="x64 x86 arm"');
    console.log('');

    process.exit(0);
}

// Do some basic argument parsing
var runOpts = nopt({
    'silent': Boolean,
    'verbose': Boolean,
    'debug': Boolean,
    'release': Boolean,
    'nobuild': Boolean,
    'device': Boolean,
    'emulator': Boolean,
    'target': String,
    'buildConfig': path
}, { d: '--verbose', r: '--release' });

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

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

new Api().run(runOpts).done();
