/*
 Copyright 2012-2015, Yahoo Inc.
 Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
 */
function registerHelpers(handlebars) {

    handlebars.registerHelper('show_picture', function (opts) {
        var num = Number(opts.fn(this)),
            rest,
            cls = '';
        if (isFinite(num)) {
            if (num === 100) {
                cls = ' cover-full';
            }
            num = Math.floor(num);
            rest = 100 - num;
            return '<div class="cover-fill' + cls + '" style="width: ' + num + '%;"></div>' +
                '<div class="cover-empty" style="width:' + rest + '%;"></div>';
        } else {
            return '';
        }
    });

    handlebars.registerHelper('if_has_ignores', function (metrics, opts) {
        return (metrics.statements.skipped +
        metrics.functions.skipped +
        metrics.branches.skipped) === 0 ? '' : opts.fn(this);
    });

    handlebars.registerHelper('show_ignores', function (metrics) {
        var statements = metrics.statements.skipped,
            functions = metrics.functions.skipped,
            branches = metrics.branches.skipped,
            result;

        if (statements === 0 && functions === 0 && branches === 0) {
            return '<span class="ignore-none">none</span>';
        }

        result = [];
        if (statements > 0) {
            result.push(statements === 1 ? '1 statement' : statements + ' statements');
        }
        if (functions > 0) {
            result.push(functions === 1 ? '1 function' : functions + ' functions');
        }
        if (branches > 0) {
            result.push(branches === 1 ? '1 branch' : branches + ' branches');
        }

        return result.join(', ');
    });

    handlebars.registerHelper('show_lines', function (opts) {
        var maxLines = Number(opts.fn(this)),
            i,
            array = [];
        for (i = 0; i < maxLines; i += 1) {
	    var nextNum = i + 1;
	    array[i] = "<a name='L" + nextNum + "'></a><a href='#L" + nextNum + "'>" + nextNum + "</a>";
        }
        return array.join('\n');
    });

    handlebars.registerHelper('show_line_execution_counts', function (context) {
        var array = [];
        context.forEach(function (data) {
            array.push('<span class="cline-any cline-' + data.covered + '">' + data.hits + '</span>');
        });
        return array.join('\n');
    });

    handlebars.registerHelper('show_code', function (context /*, opts */) {
        return context.join('\n');
    });
}

module.exports = {
    registerHelpers: registerHelpers
};
