var Step = require('step'),
    _    = require('underscore');

function HealthCheck(metadataBackend, psqlClass) {
    this.metadataBackend = metadataBackend;
    this.psqlClass = psqlClass;
}

module.exports = HealthCheck;

HealthCheck.prototype.check = function(username, query, callback) {
    var self = this,
        startTime,
        result = {
            redis: {},
            postgresql: {}
        };

    Step(
        function getDBParams() {
            startTime = Date.now();
            self.metadataBackend.getAllUserDBParams(username, this);
        },
        function runQuery(err, dbParams) {
            result.redis.ok = !err;
            result.redis.elapsed = Date.now() - startTime;

            if (err) {
                throw err;
            }

            result.redis.count = Object.keys(dbParams).length;

            var psql = new self.psqlClass({
                host: dbParams.dbhost,
                port: global.settings.db_port,
                dbname: dbParams.dbname,
                user: _.template(global.settings.db_user, {user_id: dbParams.dbuser}),
                pass: _.template(global.settings.db_user_pass, {
                    user_id: dbParams.dbuser,
                    user_password: dbParams.dbpass
                })
            });

            startTime = Date.now();
            psql.query(query, this);
        },
        function handleQuery(err, resultSet) {
            result.postgresql.ok = !err;
            if (!err) {
                result.postgresql.elapsed = Date.now() - startTime;
                result.postgresql.count = resultSet.rows.length;
            }
            callback(err, result);
        }
    );
};