var spelling = function(dbot) {
    var dbot = dbot;
    var last = {};
    
    return {
        'listener': function(data, params) {
            var q = data.message.valMatch(/^\*\*?([\d\w\s]*)$/, 2);
            var otherQ = data.message.valMatch(/^([\d\w\s]*): \*\*?([\d\w\s]*)$/, 3);
            if(q) {
                var correction = q[1];
                var candidates = last[data.channel][data.user].split(' ');
                var winner = false;
                var winnerDistance = 99999999; //urgh fix later

                for(var i=0;i<candidates.length;i++) {
                    var distance = String.prototype.distance(correction, candidates[i]);
                    if(distance < winnerDistance) {
                        winner = candidates[i];
                        winnerDistance = distance;
                    }
                }

                if(winnerDistance < 3) {
                    if(winner !== correction) {
                        var fix = last[data.channel][data.user].replace(winner, correction); 
                        last[data.channel][data.user] = fix;
                        dbot.say(data.channel, data.user + ' meant: ' + fix);
                    }
                }
            } else if(otherQ) {
                if(last[data.channel].hasOwnProperty([otherQ[1]])) {
                    var correction = otherQ[2];
                    var candidates = last[data.channel][otherQ[1]].split(' ');
                    var winner = false;
                    var winnerDistance = 99999999; //urgh fix later

                    for(var i=0;i<candidates.length;i++) {
                        var distance = String.prototype.distance(correction, candidates[i]);
                        if(distance < winnerDistance) {
                            winner = candidates[i];
                            winnerDistance = distance;
                        }
                    }

                    if(winnerDistance < 3) {
                        if(winner !== correction) {
                            var fix = last[data.channel][otherQ[1]].replace(winner, correction); 
                            last[data.channel][otherQ[1]] = fix;
                            dbot.say(data.channel, data.user + ' thinks ' + otherQ[1] + ' meant: ' + fix);
                        }
                    }
                }
            } else {
                 if(last.hasOwnProperty(data.channel)) {
                   last[data.channel][data.user] = data.message; 
                } else {
                    last[data.channel] = { };
                    last[data.channel][data.user] = data.message;
                }
            }
        },

        'on': 'PRIVMSG'
    }
} 

exports.fetch = function(dbot) {
    return spelling(dbot);
};