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

exports.defineAutoTests = function () {
    describe("StatusBar", function () {
        it("statusbar.spec.1 should exist", function() {
            expect(window.StatusBar).toBeDefined();
        });

        it("statusbar.spec.2 should have show|hide methods", function() {
            expect(window.StatusBar.show).toBeDefined();
            expect(typeof window.StatusBar.show).toBe("function");

            expect(window.StatusBar.hide).toBeDefined();
            expect(typeof window.StatusBar.hide).toBe("function");
        });

        it("statusbar.spec.3 should have set backgroundColor methods", function() {
            expect(window.StatusBar.backgroundColorByName).toBeDefined();
            expect(typeof window.StatusBar.backgroundColorByName).toBe("function");

            expect(window.StatusBar.backgroundColorByHexString).toBeDefined();
            expect(typeof window.StatusBar.backgroundColorByHexString).toBe("function");
        });

        it("statusbar.spec.4 should have set style methods", function() {
            expect(window.StatusBar.styleBlackTranslucent).toBeDefined();
            expect(typeof window.StatusBar.styleBlackTranslucent).toBe("function");

            expect(window.StatusBar.styleDefault).toBeDefined();
            expect(typeof window.StatusBar.styleDefault).toBe("function");

            expect(window.StatusBar.styleLightContent).toBeDefined();
            expect(typeof window.StatusBar.styleLightContent).toBe("function");

            expect(window.StatusBar.styleBlackOpaque).toBeDefined();
            expect(typeof window.StatusBar.styleBlackOpaque).toBe("function");

            expect(window.StatusBar.overlaysWebView).toBeDefined();
            expect(typeof window.StatusBar.overlaysWebView).toBe("function");
        });
    });
};

exports.defineManualTests = function (contentEl, createActionButton) {
    function log(msg) {
        var el = document.getElementById("info");
        var logLine = document.createElement('div');
        logLine.innerHTML = msg;
        el.appendChild(logLine);
    }

    function doShow() {
        StatusBar.show();
        log('StatusBar.isVisible=' + StatusBar.isVisible);
    }

    function doHide() {
        StatusBar.hide();
        log('StatusBar.isVisible=' + StatusBar.isVisible);
    }

    function doColor1() {
        log('set color=red');
        StatusBar.backgroundColorByName('red');
    }

    function doColor2() {
        log('set style=translucent black');
        StatusBar.styleBlackTranslucent();
    }

    function doColor3() {
        log('set style=default');
        StatusBar.styleDefault();
    }

    var showOverlay = true;
    function doOverlay() {
        showOverlay = !showOverlay;
        StatusBar.overlaysWebView(showOverlay);
        log('Set overlay=' + showOverlay);
    }

    /******************************************************************************/

    contentEl.innerHTML = '<div id="info"></div>' +
        'Also: tapping bar on iOS should emit a log.' +
        '<div id="action-show"></div>' +
        'Expected result: Status bar will be visible' +
        '</p> <div id="action-hide"></div>' +
        'Expected result: Status bar will be hidden' +
        '</p> <div id="action-color2"></div>' +
        'Expected result: Status bar text will be a light (white) color' +
        '</p> <div id="action-color3"></div>' +
        'Expected result: Status bar text will be a dark (black) color' +
        '</p> <div id="action-overlays"></div>' +
        'Expected result:<br>Overlay true = status bar will lay on top of web view content<br>Overlay false = status bar will be separate from web view and will not cover content' +
        '</p> <div id="action-color1"></div>' +
        'Expected result: If overlay false, background color for status bar will be red';

    log('StatusBar.isVisible=' + StatusBar.isVisible);
    window.addEventListener('statusTap', function () {
        log('tap!');
    }, false);

    createActionButton("Show", function () {
        doShow();
    }, 'action-show');

    createActionButton("Hide", function () {
        doHide();
    }, 'action-hide');

    createActionButton("Style=red (background)", function () {
        doColor1();
    }, 'action-color1');

    createActionButton("Style=translucent black", function () {
        doColor2();
    }, 'action-color2');

    createActionButton("Style=default", function () {
        doColor3();
    }, 'action-color3');

    createActionButton("Toggle Overlays", function () {
        doOverlay();
    }, 'action-overlays');
};
