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

var api = function(dbot) {
    return {

        /**
         * Create a new profile for a given "databanked" user.
         * Typically only called as a hook to the new_user emit event.
         * TODO(@samstudio8) Migrate to internalAPI
         */
        "createProfile": function(user, callback){
            if(user){
                this.db.create('profiles', user.id, {
                    'id': user.id,
                    'profile': dbot.config.profile.schema.profile,
                    'preferences': dbot.config.profile.schema.preferences
                }, function(err, result){
                    if(err){
                        console.log(err);
                    }
                });
            }
        },
  
        //TODO(samstudio8) Merge Profiles
        'mergeProfile': function(server, nick, callback){
            console.log("mergeProfile not implemented");
        },

        'getProfile': function(server, nick, callback){
            dbot.api.users.resolveUser(server, nick, function(user){
                if(user){
                    this.db.read('profiles', user.id, function(err, profile){
                        if(!err){
                            callback(false, user, profile);
                        }
                        else{
                            callback(true, user, null);
                        }
                    });
                }
                else{
                    callback(true, null, null);
                }
            }.bind(this));
        },

        'getProfileByUUID': function(uuid, callback){
            if(uuid){
                this.db.read('profiles', uuid, function(err, profile){
                    if(!err){
                        callback(false, uuid, profile);
                    }
                    else{
                        callback(true, uuid, null);
                    }
                });
            }
            else{
                callback(true, null, null);
            }
        },

        'getAllProfiles': function(callback){
            var profiles = [];
            this.db.scan('profiles', function(profile){
                profiles.push(profile);
            }, function(err){
                if(!err){
                    callback(profiles);
                }
                else{
                    console.log(err);
                }
            });
        },

        'setProperty': function(server, nick, field, value, callback){
            this.api.getProfile(server, nick, function(err, user, profile){
                if(!err){
                    profile.profile[field] = value;
                    this.db.save('profiles', user.id, profile, function(err){
                        if(!err){
                            callback("Ok!");
                        }
                    });
                }
            }.bind(this));
        },

        'getProperty': function(server, nick, field, callback){
            this.api.getProfile(server, nick, function(err, user, profile){
                if(!err){
                    if(profile.profile[field]){
                        callback(profile.profile[field]);
                    }
                }
            }.bind(this));
        },
    }
};

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