var MarkdownIt = require('markdown-it'),
    converter = new MarkdownIt({
        html: true,
        breaks: true,
        linkify: true
    })
        .use(require('markdown-it-footnote'))
        .use(require('markdown-it-lazy-headers'))
        .use(require('markdown-it-mark'))
        .use(function namedHeaders(md) {
            // match legacy Showdown IDs
            var slugify = function (inputString, usedHeaders) {
                var slug = inputString.replace(/[^\w]/g, '').toLowerCase();
                if (usedHeaders[slug]) {
                    usedHeaders[slug] += 1;
                    slug += usedHeaders[slug];
                }
                return slug;
            };
            var originalHeadingOpen = md.renderer.rules.heading_open;

            // originally from https://github.com/leff/markdown-it-named-headers
            // moved here to avoid pulling in http://stringjs.com dependency
            md.renderer.rules.heading_open = function (tokens, idx, something, somethingelse, self) {
                var usedHeaders = {};

                tokens[idx].attrs = tokens[idx].attrs || [];

                var title = tokens[idx + 1].children.reduce(function (acc, t) {
                    return acc + t.content;
                }, '');

                var slug = slugify(title, usedHeaders);
                tokens[idx].attrs.push(['id', slug]);

                if (originalHeadingOpen) {
                    return originalHeadingOpen.apply(this, arguments);
                } else {
                    return self.renderToken.apply(self, arguments);
                }
            };
        });

// configure linkify-it
converter.linkify.set({
    fuzzyLink: false
});

module.exports = {
    render: function (markdown) {
        return converter.render(markdown);
    }
};