var _ = require('underscore')._;

var commands = function(dbot) {
    var commands = {
        '~alias': function(event) {
            var knownUsers = this.getServerUsers(event.server),
                alias = event.params[1].trim();

            if(_.include(knownUsers.users, alias)) {
                var aliases = this.api.getAliases(event.server, alias);
                var aliasCount = aliases.length;

                if(aliasCount != 0) {
                    var aliases = _.first(aliases, 10);
                    var including = 'including: ' + aliases.join(', ') + '.';
                    
                    event.reply(dbot.t('primary', { 
                        'user': alias, 
                        'count': aliasCount 
                    }) + including); 
                } else {
                    event.reply(dbot.t('primary', { 
                        'user': alias, 
                        'count': aliasCount 
                    }).slice(0, -2) + ".");
                }
            } else if(_.has(knownUsers.aliases, alias)) {
                event.reply(dbot.t('alias', { 
                    'alias': alias, 
                    'user': knownUsers.aliases[alias] 
                }));
            } else {
                event.reply(dbot.t('unknown_alias', { 'alias': alias }));
            }
        },

        '~setaliasparent': function(event) {
            var knownUsers = this.getServerUsers(event.server);
            var newParent = event.params[1];

            if(_.has(knownUsers.aliases, newParent)) {
                var newAlias = knownUsers.aliases[newParent]; 

                // Replace user entry
                knownUsers.users = _.without(knownUsers.users, newAlias);
                knownUsers.users.push(newParent);

                // Replace channels entries with new primary user
                this.updateChannels(event, newAlias, newParent);

                // Remove alias for new parent & add alias for new alias
                delete knownUsers.aliases[newParent];
                knownUsers.aliases[newAlias] = newParent;

                // Update aliases to point to new primary user
                this.updateAliases(event, newAlias, newParent);

                event.reply(dbot.t('aliasparentset', { 
                    'newParent': newParent, 
                    'newAlias': newAlias 
                }));

                return {
                    'server': event.server,
                    'alias': newAlias
                };
            } else {
                event.reply(dbot.t('unknown_alias', { 'alias': newParent }));
            }
            return false;
        },

        '~mergeusers': function(event) {
            var knownUsers = this.getServerUsers(event.server);
            var primaryUser = event.params[1];
            var secondaryUser = event.params[2];

            if(_.include(knownUsers.users, primaryUser) && _.include(knownUsers.users, secondaryUser)) {
                knownUsers.users = _.without(knownUsers.users, secondaryUser);
                knownUsers.aliases[secondaryUser] = primaryUser;
                this.updateAliases(event, secondaryUser, primaryUser);
                this.updateChannels(event, secondaryUser, primaryUser);

                event.reply(dbot.t('merged_users', { 
                    'old_user': secondaryUser,
                    'new_user': primaryUser
                }));
                
                return {
                    'server': event.server,
                    'secondary': secondaryUser
                };
            } else {
                event.reply(dbot.t('unprimary_error'));
            }
            return false;
        } 
    };
    
    commands['~alias'].regex = [/^~alias ([\d\w[\]{}^|\\`_-]+?)/, 2];
    commands['~setaliasparent'].regex = [/^~setaliasparent ([\d\w[\]{}^|\\`_-]+?)/, 2];
    commands['~mergeusers'].regex = [/^~mergeusers ([\d\w[\]{}^|\\`_-]+?)\s*?([\d\w[\]{}^|\\`_-]+?)/, 3];
    
    commands['~setaliasparent'].access = 'moderator';
    commands['~mergeusers'].access = 'moderator';
    
    return commands;
};

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