// ### Navigation Helper
// `{{navigation}}`
// Outputs navigation menu of static urls

var _ = require('lodash'),
    hbs = require('express-hbs'),
    i18n = require('../i18n'),
    errors = require('../errors'),
    template = require('./template'),
    navigation;

navigation = function (options) {
    /*jshint unused:false*/
    var navigationData = options.data.blog.navigation,
        currentUrl = options.data.root.relativeUrl,
        self = this,
        output,
        data;

    if (!_.isObject(navigationData) || _.isFunction(navigationData)) {
        throw new errors.IncorrectUsageError({
            message: i18n.t('warnings.helpers.navigation.invalidData')
        });
    }

    if (navigationData.filter(function (e) {
        return (_.isUndefined(e.label) || _.isUndefined(e.url));
    }).length > 0) {
        throw new errors.IncorrectUsageError({
            message: i18n.t('warnings.helpers.navigation.valuesMustBeDefined')
        });
    }

    // check for non-null string values
    if (navigationData.filter(function (e) {
        return ((!_.isNull(e.label) && !_.isString(e.label)) ||
            (!_.isNull(e.url) && !_.isString(e.url)));
    }).length > 0) {
        throw new errors.IncorrectUsageError({
            message: i18n.t('warnings.helpers.navigation.valuesMustBeString')
        });
    }

    function _slugify(label) {
        return label.toLowerCase().replace(/[^\w ]+/g, '').replace(/ +/g, '-');
    }

    // strips trailing slashes and compares urls
    function _isCurrentUrl(href, currentUrl) {
        if (!currentUrl) {
            return false;
        }

        var strippedHref = href.replace(/\/+$/, ''),
            strippedCurrentUrl = currentUrl.replace(/\/+$/, '');
        return strippedHref === strippedCurrentUrl;
    }

    // {{navigation}} should no-op if no data passed in
    if (navigationData.length === 0) {
        return new hbs.SafeString('');
    }

    output = navigationData.map(function (e) {
        var out = {};
        out.current = _isCurrentUrl(e.url, currentUrl);
        out.label = e.label;
        out.slug = _slugify(e.label);
        out.url = e.url;
        out.secure = self.secure;
        return out;
    });

    data = _.merge({}, {navigation: output});

    return template.execute('navigation', data, options);
};

module.exports = navigation;