/*
    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.
*/

const path = require('path');
const fs = require('fs-extra');
const { events } = require('cordova-common');
const rewire = require('rewire');

const rootDir = path.resolve(__dirname, '../../../..');

const handler = rewire(path.join(rootDir, 'lib/handler'));

describe('Handler export', () => {
    describe('www_dir method', () => {
        it('should return the project\'s www dir.', () => {
            const projectDir = 'mocked-project-dir-path';
            expect(
                handler.www_dir(projectDir)
            ).toBe(path.join(projectDir, 'www'));
        });
    });

    describe('package_name method', () => {
        it('should return default package name when config.xml file is missing', () => {
            spyOn(fs, 'existsSync').and.returnValue(false);
            expect(
                handler.package_name('mocked-project-dir-path')
            ).toBe('io.cordova.hellocordova');
        });

        it('should return default package name when config.xml file does not contain the widget id', () => {
            spyOn(fs, 'existsSync').and.returnValue(true);
            spyOn(fs, 'readFileSync').and.returnValue(''); // blank config.file
            expect(
                handler.package_name('mocked-project-dir-path')
            ).toBe('io.cordova.hellocordova');
        });

        it('should return package name defined on the widget element id attribute in config.xml file', () => {
            spyOn(fs, 'existsSync').and.returnValue(true);
            spyOn(fs, 'readFileSync').and.returnValue(`
                <?xml version='1.0' encoding='utf-8'?>
                    <widget id="com.foobar.random" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
                </widget>
            `);
            expect(
                handler.package_name('mocked-project-dir-path')
            ).toBe('com.foobar.random');
        });
    });

    describe('js-module method', () => {
        describe('js-module.install', () => {
            const moduleExportTestCase = jsModule => {
                const plugin_dir = 'mock';
                const plugin_id = 'com.foo.dummy-plugin';
                const www_dir = 'www';
                const moduleName = `${plugin_id}.${jsModule.name || path.basename(jsModule.src, path.extname(jsModule.src))}`;

                // spies
                spyOn(fs, 'readFileSync').and.returnValue(''); // fake scriptContent
                spyOn(fs, 'ensureDirSync').and.returnValue(true);
                spyOn(fs, 'writeFileSync');

                handler['js-module'].install(jsModule, plugin_dir, plugin_id, www_dir);

                const moduleDetination = path.dirname(path.resolve(www_dir, 'plugins', plugin_id, jsModule.src));
                const writeFileSyncContent = fs.writeFileSync.calls.argsFor(0)[1];

                expect(fs.readFileSync).toHaveBeenCalledWith(path.resolve(plugin_dir, jsModule.src), 'utf-8');
                expect(fs.ensureDirSync).toHaveBeenCalledWith(moduleDetination);
                expect(writeFileSyncContent).toContain(`cordova.define('${moduleName}'`);

                return writeFileSyncContent;
            };

            it('should write cordova.define for module "com.foo.dummy-plugin.dummy-module" (from source name) and not module.exports as module source is not JSON.', () => {
                const jsModule = { src: 'src/dummy-module', name: 'dummy-module' };
                const writeFileSyncContent = moduleExportTestCase(jsModule);
                expect(writeFileSyncContent).not.toContain('module.exports');
            });

            it('should write cordova.define for module "com.foo.dummy-plugin.dummy-module" (from source filepath) and not module.exports as module source is not JSON.', () => {
                const jsModule = { src: 'src/dummy-module' };
                const writeFileSyncContent = moduleExportTestCase(jsModule);
                expect(writeFileSyncContent).not.toContain('module.exports');
            });

            it('should write cordova.define for module "com.foo.dummy-plugin.dummy-module" (from source filepath) and not module.exports as module source is not JSON.', () => {
                const jsModule = { src: 'src/dummy-module/something.json' };
                const writeFileSyncContent = moduleExportTestCase(jsModule);
                expect(writeFileSyncContent).toContain('module.exports');
            });
        });

        describe('js-module.uninstall', () => {
            it('should emit that js-module uninstall was called.', () => {
                const jsModule = { src: 'src/dummy-module', name: 'dummy-module' };
                const www_dir = 'www';
                const plugin_id = 'com.foo.dummy-plugin';

                // spies
                spyOn(fs, 'removeSync').and.returnValue(true);
                spyOn(events, 'emit');

                handler['js-module'].uninstall(jsModule, www_dir, plugin_id);

                expect(fs.removeSync).toHaveBeenCalledWith(path.join(www_dir, 'plugins', plugin_id));
                expect(events.emit).toHaveBeenCalledWith(
                    'verbose',
                    `js-module uninstall called : ${path.join('plugins', plugin_id, jsModule.src)}`
                );
            });
        });
    });

    describe('asset method', () => {
        const plugin_dir = 'pluginDir';
        const wwwDest = 'dest';

        describe('asset.install', () => {
            it('should copySync assets to destination.', () => {
                const asset = {
                    itemType: 'asset',
                    src: 'someSrc/ServiceWorker.js',
                    target: 'ServiceWorker.js'
                };

                // Spies
                spyOn(fs, 'copySync');
                spyOn(fs, 'ensureDirSync').and.returnValue(true);

                handler.asset.install(asset, plugin_dir, wwwDest);

                expect(fs.ensureDirSync).toHaveBeenCalled();
                expect(fs.copySync).toHaveBeenCalledWith(jasmine.any(String), path.join('dest', asset.target));
            });
        });

        describe('asset.uninstall', () => {
            it('should remove assets', () => {
                const asset = { itemType: 'asset', src: 'someSrc', target: 'ServiceWorker.js' };
                const mockPluginId = 'com.foobar.random-plugin-id';

                // Spies
                spyOn(fs, 'removeSync').and.returnValue(true);

                handler.asset.uninstall(asset, wwwDest, mockPluginId);

                expect(fs.removeSync).toHaveBeenCalled();
                expect(fs.removeSync.calls.argsFor(0)[0]).toBe(path.join(wwwDest, asset.target));
                expect(fs.removeSync.calls.argsFor(1)[0]).toBe(path.join(wwwDest, 'plugins', mockPluginId));
            });
        });
    });

    describe('Unsupported Handlers', () => {
        it('should emit that the install and uninstall methods are not supported for X types.', () => {
            spyOn(events, 'emit');

            // loop unsupported types
            [
                'source-file',
                'header-file',
                'resource-file',
                'framework',
                'lib-file'
            ].forEach(type => {
                for (const method of ['install', 'uninstall']) {
                    handler[type][method]();
                    expect(events.emit).toHaveBeenCalledWith(
                        'verbose',
                        `${type}.${method} is not supported for electron`
                    );
                    events.emit.calls.reset();
                }
            });
        });
    });
});
