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

var api = function(dbot) {
    return {

        /**
         * Create a profile for a new primary user on a given server.
         * If the server does not already exist, create it.
         */
        "createProfile": function(server, primary){
            var primaryLower = primary.toLowerCase();

            if(!_.has(this.profiles, server)){
                this.profiles[server] = {};
            }
            if(!_.has(this.profiles[server], primaryLower)){
                this.profiles[server][primaryLower] = {
                    "profile": {},
                    "preferences": {}
                };
                this.profiles[server][primaryLower].profile.primary = primary;
            }

            // Ensure all profiles have the keys specified by config.json
            //TODO(samstudio8) Currently only handles "top-level"
            _.defaults(this.profiles[server][primaryLower].profile, this.config.schema.profile);
            _.defaults(this.profiles[server][primaryLower].preferences, this.config.schema.preferences);
        },

        /**
         * Given a server and "new" alias, resolve this alias to the user's 
         * new primary name and move profile data pertaining to the alias to 
         * the new primary name.
         */
        'renameProfile': function(server, alias){
            if(!_.has(this.profiles, server)) return;
            var profiles = dbot.db.profiles[server];

            if(_.has(profiles, alias)){
                var primary = dbot.api.users.resolveUser(server, alias, true);
                var primaryLower = primary.toLowerCase();
                alias = alias.trim().toLowerCase();

                profiles[primaryLower] = profiles[alias];
                profiles[primaryLower].profile.primary = primary;
                delete profiles[alias];
            }
        },

        /**
         * Given a server and a primary username which has been converted to a
         * secondary alias find and remove the profile for the alias.
         */
        'mergeProfile': function(server, mergeFromPrimary){
            if(!_.has(this.profiles, server)) return;
            var profiles = dbot.db.profiles[server];

            mergeFromPrimary = mergeFromPrimary.toLowerCase();
            var mergeToPrimary = dbot.api.users.resolveUser(server, mergeFromPrimary, true).toLowerCase();
            if(!_.has(profiles, mergeToPrimary)
                    || !_.has(profiles, mergeFromPrimary)) return;

            // Remove the profile of the alias
            delete profiles[mergeFromPrimary];
        },
    }
};

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