/**
    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 shell = require('shelljs');
var fs = require('fs-extra');
var path = require('path');

var FIXTURES = path.join(__dirname, '../unit/fixtures');
var EXTENSIONS_PLUGIN = 'org.test.plugins.extensionsplugin';
var extensionsPlugin = path.join(FIXTURES, EXTENSIONS_PLUGIN);

var templateFolder = path.join(__dirname, '../../template');
var Api = require(path.join(templateFolder, 'cordova/Api'));
var PluginInfo = require('cordova-common').PluginInfo;

describe('Cordova create and build', function () {

    var templateDir = path.join(__dirname, '../../template');
    var projectFolder = 'testcreate 応用';
    var workingDirectory = path.join(__dirname, '../../temp');
    var buildDirectory = path.join(workingDirectory, 'platforms');
    var appPackagesFolder = path.join(buildDirectory, projectFolder, 'AppPackages');
    var buildScriptPath = '"' + path.join(buildDirectory, projectFolder, 'cordova', 'build') + '"';
    var prepareScriptPath = '"' + path.join(buildDirectory, projectFolder, 'cordova', 'prepare') + '"';

    var silent = false;

    function verifySubDirContainsFile (subDirName, fileName, count) {
        count = typeof count !== 'undefined' ? count : 1;

        var subDir = path.join(appPackagesFolder, subDirName);
        var packages = shell.ls(subDir);
        expect(packages.filter(function (file) { return file.match(fileName); }).length).toBe(count);
    }

    function _expectExist (fileNamePattern, count) {
        count = typeof count !== 'undefined' ? count : 1;

        var packages = shell.ls(appPackagesFolder);
        expect(packages.filter(function (file) { return file.match(fileNamePattern); }).length).toBe(count);
    }

    function _expectSubdirAndFileExist (subDirName, fileName, count) {
        count = typeof count !== 'undefined' ? count : 1;

        _expectExist(subDirName);
        verifySubDirContainsFile(subDirName, fileName, count);
    }

    beforeEach(function () {
        fs.ensureDirSync(buildDirectory);
        fs.copySync(path.join(templateDir, 'www'), path.join(workingDirectory, 'www'));
        fs.copySync(path.join(templateDir, 'config.xml'), path.join(workingDirectory, 'config.xml'));
        shell.exec(path.join('bin', 'create') + ' "' + path.join(buildDirectory, projectFolder) + '" com.test.app 応用', { silent: silent });
        shell.exec(prepareScriptPath + '', { silent: silent });
    });

    afterEach(function () {
        fs.removeSync(workingDirectory);
    });

    it('spec.1 should create new project', function () {
        expect(fs.existsSync(path.join(buildDirectory, projectFolder))).toBe(true);
    });

    describe('Windows 10', function () {

        // default

        it('spec.2a should build default (win10) project', function () {
            shell.exec(buildScriptPath + '', { silent: silent });
            _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_anycpu_debug_Test', 'CordovaApp.Windows10_1.0.0.0_anycpu_debug.appx');
        });

        // --appx

        it('spec.2b should build uap (win10) project', function () {
            shell.exec(buildScriptPath + ' --appx=uap', { silent: silent });
            _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_anycpu_debug_Test', 'CordovaApp.Windows10_1.0.0.0_anycpu_debug.appx');
        });

        it('spec.2c should build uwp (win10) project', function () {
            shell.exec(buildScriptPath + ' --appx=uwp', { silent: silent });
            _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_anycpu_debug_Test', 'CordovaApp.Windows10_1.0.0.0_anycpu_debug.appx');
        });

        // --archs

        it('spec.3a should build project for particular CPU', function () {
            shell.exec(buildScriptPath + ' --archs=\"x64\"', { silent: silent }); /* eslint no-useless-escape : 0 */
            _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_x64_debug_Test', 'CordovaApp.Windows10_1.0.0.0_x64_debug.appx');
        });

        it('spec.4a should build project for CPUs separated by whitespaces', function () {
            shell.exec(buildScriptPath + ' --archs=\"x64 x86 arm anycpu\"', { silent: silent }); /* eslint no-useless-escape : 0 */
            _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_x64_debug_Test', 'CordovaApp.Windows10_1.0.0.0_x64_debug.appx');
            _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_x86_debug_Test', 'CordovaApp.Windows10_1.0.0.0_x86_debug.appx');
            _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_arm_debug_Test', 'CordovaApp.Windows10_1.0.0.0_arm_debug.appx');
            _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_anycpu_debug_Test', 'CordovaApp.Windows10_1.0.0.0_anycpu_debug.appx');
        });

        // "InProcessServer extension"

        it('spec.5a should build project containing plugin with InProcessServer extension', function () {
            var extensionsPluginInfo, api;

            extensionsPluginInfo = new PluginInfo(extensionsPlugin);
            api = new Api();
            api.root = path.join(buildDirectory, projectFolder);
            api.locations.root = path.join(buildDirectory, projectFolder);
            api.locations.www = path.join(buildDirectory, projectFolder, 'www');

            return api.addPlugin(extensionsPluginInfo)
                .then(function () {
                    shell.exec(buildScriptPath, { silent: silent });
                    _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_anycpu_debug_Test', 'CordovaApp.Windows10_1.0.0.0_anycpu_debug.appx');
                });
        });

        // --release --bundle

        it('spec.6a should generate appxupload and appxbundle for Windows 10 project bundle release build', function () {
            // FIXME Fails for VS 2017 on AppVeyor
            if (process.env.APPVEYOR_BUILD_WORKER_IMAGE === 'Visual Studio 2017') {
                pending('This test is broken for VS 2017 on AppVeyor');
            }

            shell.exec(buildScriptPath + ' --release --bundle --archs=\"x64 x86 arm\"', { silent: silent });
            _expectExist(/.*bundle\.appxupload$/, 3);
            _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_Test', 'CordovaApp.Windows10_1.0.0.0_x64_x86_arm.appxbundle');
        });

        // --release (non-bundle)

        it('spec.7 should generate appxupload for Windows 10 project non-bundle release build', function () {
            shell.exec(buildScriptPath + ' --release --archs=\"x64 x86 arm\"', { silent: silent });
            _expectExist(/.*\.appxupload$/, 3);
            // CB-12416 Should build appx in separate dirs for each architecture
            // Should contain a subdirectory for each of the architectures
            // These subdirectories should contain corresponding appx files
            _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_arm_Test', 'CordovaApp.Windows10_1.0.0.0_arm.appx');
            _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_x64_Test', 'CordovaApp.Windows10_1.0.0.0_x64.appx');
            _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_x86_Test', 'CordovaApp.Windows10_1.0.0.0_x86.appx');
        });

    });

    describe('Windows 8.1', function () {

        beforeEach(function () {
            if (process.env.APPVEYOR_BUILD_WORKER_IMAGE === 'Visual Studio 2017' && process.env.MSBUILDDIR !== 'C:\\Program Files (x86)\\MSBuild\\14.0\\bin\\') {
                pending('Windows 8.1 builds are not supported by Visual Studio 2017: https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2017-compatibility-vs#windows-store-and-windows-phone-apps');
                /*
                    via https://issues.apache.org/jira/browse/CB-13874
                    > Projects for Windows Store 8.1 and 8.0, and Windows Phone 8.1 and 8.0 are not supported in this release.
                    > To maintain these apps, continue to use Visual Studio 2015
                */
            }
        });

        it('spec.2d should build 8.1 win project', function () {
            shell.exec(buildScriptPath + ' --appx=8.1-win', { silent: silent });
            _expectExist(/.*Windows.*\.appxupload/);
        });

        it('spec.2e should build 8.1 phone project', function () {
            shell.exec(buildScriptPath + ' --appx=8.1-phone', { silent: silent });
            _expectExist(/.*Phone.*\.appxupload/);
        });

        it('spec.2f should build 8.1 win + phone project', function () {
            shell.exec(buildScriptPath + ' --appx=8.1', { silent: silent });
            _expectExist(/.*Windows.*\.appxupload/);
            _expectExist(/.*Phone.*\.appxupload/);
        });

        // --archs

        it('spec.3b should build project (8.1) for particular CPU', function () {
            shell.exec(buildScriptPath + ' --appx=8.1 --archs=\"x64\"', { silent: silent }); /* eslint no-useless-escape : 0 */
            _expectExist(/.*Phone.*x64.*\.appxupload/);
            _expectExist(/.*Windows.*x64.*\.appxupload/);
        });

        it('spec.3c should build project (8.1-win) for particular CPU', function () {
            shell.exec(buildScriptPath + ' --appx=8.1-win --archs=\"x64\"', { silent: silent }); /* eslint no-useless-escape : 0 */
            _expectExist(/.*Windows.*x64.*\.appxupload/);
        });

        it('spec.3d should build project (8.1-phone) for particular CPU', function () {
            shell.exec(buildScriptPath + ' --appx=8.1-phone --archs=\"x64\"', { silent: silent }); /* eslint no-useless-escape : 0 */
            _expectExist(/.*Phone.*x64.*\.appxupload/);
        });

        it('spec.4b should build project (8.1) for CPUs separated by whitespaces', function () {
            shell.exec(buildScriptPath + ' --appx=8.1 --archs=\"x64 x86 arm anycpu\"', { silent: silent }); /* eslint no-useless-escape : 0 */
            _expectExist(/.*Phone.*x86.*\.appxupload/);
            _expectExist(/.*Phone.*x64.*\.appxupload/);
            _expectExist(/.*Phone.*arm.*\.appxupload/);
            _expectExist(/.*Phone.*AnyCPU.*\.appxupload/i);
            _expectExist(/.*Windows.*x64.*\.appxupload/);
            _expectExist(/.*Windows.*x86.*\.appxupload/);
            _expectExist(/.*Windows.*arm.*\.appxupload/);
            _expectExist(/.*Windows.*anycpu.*\.appxupload/i);
        });

        // "InProcessServer extension"

        it('spec.5b should build project (8.1) containing plugin with InProcessServer extension', function () {
            var extensionsPluginInfo, api;

            extensionsPluginInfo = new PluginInfo(extensionsPlugin);
            api = new Api();
            api.root = path.join(buildDirectory, projectFolder);
            api.locations.root = path.join(buildDirectory, projectFolder);
            api.locations.www = path.join(buildDirectory, projectFolder, 'www');

            return api.addPlugin(extensionsPluginInfo)
                .then(function () {
                    shell.exec(buildScriptPath + ' --appx=8.1', { silent: silent });
                    _expectExist(/.*Windows.*\.appxupload/);
                    _expectExist(/.*Phone.*\.appxupload/);
                });
        });

        // --release --bundle

        it('spec.6b should generate appxupload and appxbundle for Windows Phone 8.1 project bundle release build', function () {
            shell.exec(buildScriptPath + ' --release --appx=8.1-phone --bundle --archs=\"x64 x86 arm\"', { silent: silent });
            _expectExist(/.*bundle\.appxupload$/, 3);
            _expectSubdirAndFileExist('CordovaApp.Phone_1.0.0.0_Test', 'CordovaApp.Phone_1.0.0.0_x64_x86_arm.appxbundle');
        });

        // --release (non-bundle)

        it('spec.8 for a non-bundle case for Windows Phone 8.1 it should build appx in separate dirs for each architecture', function () {
            shell.exec(buildScriptPath + ' --release --appx=8.1-phone --phone --archs=\"x86 arm\"', { silent: silent });
            _expectExist(/.*\.appxupload$/, 2);
            _expectSubdirAndFileExist('CordovaApp.Phone_1.0.0.0_arm_Test', 'CordovaApp.Phone_1.0.0.0_arm.appx');
            _expectSubdirAndFileExist('CordovaApp.Phone_1.0.0.0_x86_Test', 'CordovaApp.Phone_1.0.0.0_x86.appx');
        });

    });

});
