// Require the core node modules.
var MongoClient = require( "mongodb" ).MongoClient;
var Q = require( "q" );

// Require our core application modules.
var appError = require( "./app-error" ).createAppError;


// ----------------------------------------------------------------------------------- //
// ----------------------------------------------------------------------------------- //


// I am the shared MongoClient instance for this process.
var sharedMongoClient = null;

// Export the public methods.
exports.connect = connect;
exports.getResource = getResource;


// ---
// PUBLIC METHODS.
// ---


// I connect to the given MongoDB and store the database instance for use by any context
// that requires this module. Returns a promise.
function connect( connectionString ) {

	var deferred = Q.defer();

	MongoClient.connect(
		connectionString,
		function handleConnected( error, mongo ) {

			if ( error ) {

				deferred.reject( error );

			}

			deferred.resolve( sharedMongoClient = mongo );

		}
	);

	return( deferred.promise );

}


// I get the shared MongoClient resource.
function getResource() {

	if ( ! sharedMongoClient ) {

		throw(
			appError({
				type: "App.DatabaseNotConnected",
				message: "The MongoDB connection pool has not been established."
			})
		);

	}

	return( Q( sharedMongoClient ) );

}