/*
       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 Q     = require('Q'),
    path  = require('path'),
    nopt  = require('nopt'),
    utils = require('./utils'),
    shell = require('shelljs'),
    MSBuildTools = require('./MSBuildTools');

// Platform project root folder
var ROOT = path.join(__dirname, '..', '..');

function parseAndValidateArgs(argv) {
    // parse and validate args
    args = nopt({'debug': Boolean, 'release': Boolean, 'archs': [String]}, {'-r': '--release'}, argv);
    // Validate args
    if (args.debug && args.release) {
        return Q.reject('Only one of "debug"/"release" options should be specified');
    }
    // get build options/defaults and resolvew with buildopts object
    return Q.resolve({
        buildType: args.release ? 'release' : 'debug',
        buildArchs: args.archs ? args.archs.split(' ') : ['anycpu'],
    });
}

// help/usage function
module.exports.help = function () {
    console.log("");
    console.log("Usage: build [ --debug | --release ] [--archs=\"<list of architectures...>\"]");
    console.log("    --help    : Displays this dialog.");
    console.log("    --debug   : Cleans and builds project in debug mode.");
    console.log("    --release : Cleans and builds project in release mode.");
    console.log("    --release : Cleans and builds project in release mode.");
    console.log("    --archs   : Builds project binaries for specific chip architectures. `arm` and `x86` are supported for wp8");
    console.log("examples:");
    console.log("    build ");
    console.log("    build --debug");
    console.log("    build --release");
    console.log("    build --release --archs=\"arm x86\"");
    console.log("");
};

// builds cordova-windows application with parameters provided.
// See 'help' function for args list
module.exports.run = function (argv) {
    if (!utils.isCordovaProject(ROOT)){
        return Q.reject('Could not find project at ' + ROOT);
    }

    return parseAndValidateArgs(argv)
    .then(function (buildopts) {
        // WP8 requires x86 version of MSBuild, CB-6732
        var is64bitSystem = process.env["PROCESSOR_ARCHITECTURE"] != 'x86';

        // Get available msbuild tools
        return MSBuildTools.findAvailableVersion(is64bitSystem)
        .then(function (msbuildTools) {
            // then build all architectures specified
            // chain promises each after previous with reduce function
            return buildopts.buildArchs.reduce(function (promise, buildarch) {
                return promise.then(function () {
                    buildarch = buildarch == "anycpu" ? "any cpu" : buildarch;
                    // serach for first solution file found
                    // this is performed due to solution file can be renamed in create
                    var solutionFiles = shell.ls(path.join(ROOT, '*.sln'));
                    if (solutionFiles && solutionFiles[0]) {
                      return msbuildTools.buildProject(solutionFiles[0], buildopts.buildType, buildarch);
                    }
                    return Q.reject('No solution files found in project directory');
                });
            }, Q());
        });
    });
};