/*
    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 rewire = require('rewire');
const path = require('path');
const fs = require('fs-extra');
const { ConfigParser } = require('cordova-common');

const rootDir = path.resolve(__dirname, '../../../..');
const fixturesDir = path.join(rootDir, 'tests/spec/fixtures');

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

// Create a real config object before mocking out everything.
const cfg1 = new ConfigParser(path.join(fixturesDir, 'test-config-1.xml'));
const cfg2 = new ConfigParser(path.join(fixturesDir, 'test-config-2.xml'));
const cfgEmpty = new ConfigParser(path.join(fixturesDir, 'test-config-empty.xml'));

const locations = {
    buildRes: path.join('mock', 'build-res'),
    www: path.join('mock', 'www'),
    configXml: path.join('mock', 'config.xml')
};

const defaultInitManifest = {
    background_color: '#FFF',
    display: 'standalone',
    orientation: 'any',
    start_url: 'index.html'
};

describe('ManifestJson class', () => {
    let manifestJsonParser;

    beforeEach(() => {
        manifestJsonParser = new ManifestJsonParser(locations.www);
    });

    it('should have been constructed with initial values.', () => {
        expect(manifestJsonParser).toBeDefined();
        expect(manifestJsonParser.path).toEqual(path.join(locations.www, 'manifest.json'));
        expect(manifestJsonParser.www).toEqual(locations.www);
        expect(manifestJsonParser.manifest).toEqual(defaultInitManifest);
    });

    it('should return when config xml is not defined.', () => {
        manifestJsonParser.configure();
        expect(manifestJsonParser.manifest).toEqual(defaultInitManifest);
    });

    it('should set manifest json object values to default, when config xml is empty.', () => {
        manifestJsonParser.configure(cfgEmpty);
        expect(manifestJsonParser.manifest).toEqual(jasmine.objectContaining({
            start_url: undefined
        }));
    });

    it('should read and set manifest json object values from the first config xml.', () => {
        manifestJsonParser.configure(cfg1);
        expect(manifestJsonParser.manifest).toEqual(jasmine.objectContaining({
            orientation: 'portrait',
            name: 'HelloWorld',
            short_name: 'HelloWorld',
            version: 'whatever',
            description: 'A sample Apache Cordova application.',
            author: 'Cordova Team',
            icons: [{ src: 'res/electron/cordova.png', type: 'image/png', sizes: '16x16' }]
        }));
    });

    it('should read and set manifest json object values from second config xml.', () => {
        manifestJsonParser.configure(cfg2);
        expect(manifestJsonParser.manifest).toEqual(jasmine.objectContaining({
            orientation: 'landscape',
            name: 'HelloWorld',
            short_name: 'Hello',
            theme_color: '0xff0000ff',
            version: 'whatever',
            description: 'A sample Apache Cordova application.',
            author: 'Cordova Team'
        }));
    });

    it('should update theme color if start_url exists in path and contains meta theme-color.', () => {
        spyOn(fs, 'existsSync').and.returnValue(true);
        spyOn(fs, 'readFileSync').and.returnValue('<meta name="theme-color" content="#33363b">');

        manifestJsonParser.configureThemeColor(cfg1);
        expect(manifestJsonParser.manifest.theme_color).toEqual('#33363b');
    });

    it('should update theme color with StatusBarBackgroundColor if start_url file does not contain meta theme-color.', () => {
        spyOn(fs, 'existsSync').and.returnValue(true);
        spyOn(fs, 'readFileSync').and.returnValue('');

        manifestJsonParser.configureThemeColor(cfg2);
        expect(manifestJsonParser.manifest.theme_color).toEqual('0xff0000ff');
    });

    it('should update theme color with no value when StatusBarBackgroundColor is missing and start_url file does not contain meta theme-color.', () => {
        spyOn(fs, 'existsSync').and.returnValue(true);
        spyOn(fs, 'readFileSync').and.returnValue('');

        manifestJsonParser.configureThemeColor(cfgEmpty);
        expect(manifestJsonParser.manifest.theme_color).toEqual(undefined);
    });

    it('should write something.', () => {
        spyOn(fs, 'writeFileSync').and.returnValue(true);

        manifestJsonParser.write();
        expect(fs.writeFileSync).toHaveBeenCalledWith(
            jasmine.any(String),
            JSON.stringify(defaultInitManifest, null, 2),
            'utf8'
        );
    });

    it('should write defaults with empty config.xml.', () => {
        spyOn(fs, 'writeFileSync').and.returnValue(true);

        manifestJsonParser.configure(cfgEmpty)
            .write();

        const expectedManifest = {
            background_color: '#FFF',
            display: 'standalone',
            orientation: 'any'
        };

        expect(fs.writeFileSync).toHaveBeenCalledWith(
            jasmine.any(String),
            JSON.stringify(expectedManifest, null, 2),
            'utf8'
        );
    });

    it('should write with user defined values from config.xml.', () => {
        spyOn(fs, 'writeFileSync').and.returnValue(true);

        manifestJsonParser.configure(cfg1)
            .write();

        const expectedManifest = {
            background_color: '#FFF',
            display: 'standalone',
            orientation: 'portrait',
            start_url: 'index.html',
            name: 'HelloWorld',
            short_name: 'HelloWorld',
            version: 'whatever',
            description: 'A sample Apache Cordova application.',
            author: 'Cordova Team',
            icons: [{ src: 'res/electron/cordova.png', type: 'image/png', sizes: '16x16' }]
        };

        expect(fs.writeFileSync).toHaveBeenCalledWith(
            jasmine.any(String),
            JSON.stringify(expectedManifest, null, 2),
            'utf8'
        );
    });
});
