var _ = require('lodash');
var path = require('path');

var markdownParser = require('gitbook-markdown');
var asciidocParser = require('gitbook-asciidoc');

var Promise = require('./utils/promise');

// This list is ordered by priority of parsers to use
var PARSERS = [
    createParser(markdownParser, {
        name: 'markdown',
        extensions: ['.md', '.markdown', '.mdown']
    }),
    createParser(asciidocParser, {
        name: 'asciidoc',
        extensions: ['.adoc', '.asciidoc']
    })
];


// Prepare and compose a parser
function createParser(parser, base) {
    var nparser = base;

    nparser.glossary = Promise.wrapfn(parser.glossary);
    nparser.glossary.toText = Promise.wrapfn(parser.glossary.toText);

    nparser.summary = Promise.wrapfn(parser.summary);
    nparser.summary.toText = Promise.wrapfn(parser.summary.toText);

    nparser.langs = Promise.wrapfn(parser.langs);
    nparser.langs.toText = Promise.wrapfn(parser.langs.toText);

    nparser.readme = Promise.wrapfn(parser.readme);

    nparser.page = Promise.wrapfn(parser.page);
    nparser.page.prepare = Promise.wrapfn(parser.page.prepare || _.identity);

    nparser.inline = Promise.wrapfn(parser.inline);

    return nparser;
}

// Return a specific parser
function getParser(name) {
    return _.find(PARSERS, {
        name: name
    });
}

// Return a specific parser according to an extension
function getParserByExt(ext) {
    return _.find(PARSERS, function(input) {
        return input.name == ext || _.contains(input.extensions, ext);
    });
}

// Return parser for a file
function getParserForFile(filename) {
    return getParser(path.extname(filename));
}

module.exports = {
    all: PARSERS,
    extensions: _.flatten(_.pluck(PARSERS, 'extensions')),
    get: getParser,
    getByExt: getParserByExt,
    getForFile: getParserForFile
};
