var common = require('../casper_lib/common.js');

// Test basic tab navigation.

common.start_and_log_in();

casper.then(function () {
    casper.test.info('Testing navigation');
});

function wait_for_tab(tab) {
    casper.waitForSelector('#' + tab + '.tab-pane.active', function () {
        casper.test.assertExists('#' + tab + '.tab-pane.active', tab + ' page is active');
    });
}

function then_navigate_to(click_target, tab) {
    casper.then(function () {
        casper.test.info('Visiting #' + click_target);
        casper.click("a[href='#" + click_target + "']");
        wait_for_tab(tab);
    });
}

function then_navigate_to_settings() {
    casper.then(function () {
        casper.test.info('Navigate to settings');
        var menu_selector = '#settings-dropdown';
        casper.waitUntilVisible(menu_selector, function () {
            casper.click(menu_selector);
            casper.waitUntilVisible('a[href^="#settings"]', function () {
                casper.click('a[href^="#settings"]');
                casper.waitUntilVisible('#settings_page', function () {
                    casper.test.assertExists('#settings_page', "Settings page is active");
                    casper.click('#settings_page .exit');
                });
            });
        });
    });
}

function then_navigate_to_subscriptions() {
    casper.then(function () {
        casper.test.info('Navigate to subscriptions');

        var menu_selector = '#settings-dropdown';
        casper.waitUntilVisible(menu_selector, function () {
            casper.click(menu_selector);
            casper.click('a[href^="#streams"]');
            casper.waitUntilVisible("#subscription_overlay", function () {
                casper.test.assertExists('#subscriptions_table', "#subscriptions page is active");
                casper.click('#subscription_overlay .exit');
            });
        });
    });
}

// Take a navigation tour of the app.
// Entries are (click target, tab that should be active after clicking).
then_navigate_to_settings();

var verona_narrow;
casper.then(function () {
    var verona_id = casper.evaluate(function () {
        return stream_data.get_stream_id('Verona');
    });
    verona_narrow = 'narrow/stream/' + verona_id + '-Verona';
    casper.test.info(verona_narrow);

    then_navigate_to(verona_narrow, 'home');
    then_navigate_to('home', 'home');
    then_navigate_to_subscriptions();
    then_navigate_to('', 'home');
    then_navigate_to_settings();
    then_navigate_to('narrow/is/private', 'home');
    then_navigate_to_subscriptions();
    then_navigate_to(verona_narrow, 'home');
});

var initial_page_load_time;
var hash;
var orig_hash;

// Verify reload.js's server-initiated browser reload hash
// save/restore logic works.
casper.then(function () {
    initial_page_load_time = casper.evaluate(function () {
        return page_params.page_load_time;
    });
    casper.test.info(initial_page_load_time);
    orig_hash = casper.evaluate(function () {
        return window.location.hash;
    });
    casper.evaluate(function () {
        reload.initiate({immediate: true});
    });
});

casper.then(function () {
    // Confirm that's we've actually reloaded using the page load timestamp.
    casper.waitFor(function () {
        return casper.evaluate(function (input) {
            return page_params.page_load_time > input;
        }, initial_page_load_time);
    }, function () {
        // Verify the hash was preserved
        hash = casper.evaluate(function () {
            return window.location.hash;
        });
    });
});

casper.then(function () {
    casper.waitUntilVisible('#zfilt', function () {
        // Verify that we're narrowed to the target stream
        casper.test.assertEquals(orig_hash, hash);
        casper.test.assertVisible("#zfilt");
        casper.test.assertNotVisible("#zhome");
    });
});

common.then_log_out();

// Run the above queued actions.
casper.run(function () {
    casper.test.done();
});
