/* jshint strict: true */

'use strict';

var Q = require('q');
var mysql2 = require('mysql2');
var instances = {};

function DB() {
    this.pool = null;
}

/**
 * Setup the Database connection pool for this instance
 * @param  {Object} config
 */
DB.prototype.configure = function(config) {
    this.pool = mysql2.createPool(config);
};

/**
 * Run DB query
 * @param  {String} query
 * @param  {Object} [params]
 * @return {Promise}
 */
DB.prototype.query = function(query, params) {
    params = params || {};
    var db = this;

    return Q.Promise(function(resolve, reject) {
        db.pool.getConnection(function(err, con) {
            if (err) {
                if (con) {
                    con.release();
                }

                return reject(err);
            }

            con.query(query, params, function(err) {
                if (err) {
                    if (con) {
                        con.release();
                    }

                    return reject(err);
                }

                resolve([].splice.call(arguments, 1));
                con.release();
            });
        });
    });
};

/**
 * Run DB execute
 * @param  {String} query
 * @param  {Object} [params]
 * @return {Promise}
 */
DB.prototype.execute = function(query, params) {
    params = params || {};
    var db = this;

    return Q.Promise(function(resolve, reject) {
        db.pool.getConnection(function(err, con) {
            if (err) {
                if (con) {
                    con.release();
                }

                return reject(err);
            }

            con.execute(query, params, function(err) {
                if (err) {
                    if (con) {
                        con.unprepare(query);
                        con.release();
                    }

                    return reject(err);
                }

                resolve([].splice.call(arguments, 1));
                con.unprepare(query);
                con.release();
            });
        });
    });
};

/**
 * Disconnect from database
 */
DB.prototype.end = function() {
    var db = this;
    db.end();
};

module.exports = function(name) {
    name = name || '_default_';

    if (!instances[name]) {
        instances[name] = new DB();
    }

    return instances[name];
};