(function() {
    'use strict';
    
    var DIR         = './',
        DIR_LIB     = '../',
        DIR_ROOT    = __dirname + '/' + DIR_LIB + '../',
        
        fs          = require('fs'),
        
        root        = require(DIR + 'root'),
        pipe        = require('pipe-io'),
        ponse       = require('ponse'),
        markdown    = require('markdown-it')();
    
    function check(name, request, callback) {
        if (typeof name !== 'string')
            throw(Error('name should be string!'));
        
        else if (!request)
            throw(Error('request could not be empty!'));
        
        else if (typeof callback !== 'function')
            throw(Error('callback should be function!'));
    }
    
    module.exports  = function(name, request, callback) {
        var query,
            method = request.method;
        
        check(name, request, callback);
        
        switch(method) {
            case 'GET':
                name    = name.replace('/markdown', '');
                query   = ponse.getQuery(request);
                
                if (query === 'relative')
                    name = DIR_ROOT + name;
                else
                    name = root(name);
                
                fs.readFile(name, 'utf8', function(error, data) {
                    if (error)
                        callback(error);
                    else
                        parse(data, callback);
                });
                break;
            
            case 'PUT':
                pipe.getBody(request, function(error, data) {
                    if (error)
                        callback(error);
                    else
                        parse(data, callback);
                });
                break;
        }
    };
    
    function parse(data, callback) {
        var md;
        
        process.nextTick(function() {
            md = markdown.render(data);
            
            callback(null, md);
        });
    }
    
})();
