/**
 * Database Mock - wrapper for database.js, makes system use separate test db, instead of production
 * ATTENTION: testing db is flushed before every use!
 */

(function(module) {
	'use strict';
	/*global require, before*/

	var path  = require('path'),
		nconf = require('nconf'),
		winston = require('winston'),
		errorText;


	nconf.file({ file: path.join(__dirname, '../../config.json') });
	nconf.defaults({
		base_dir: path.join(__dirname,'../..'),
		themes_path: path.join(__dirname, '../../node_modules'),
		upload_url: path.join(path.sep, '../../uploads', path.sep),
		views_dir: path.join(__dirname, '../../public/templates'),
		relative_path: ''
	});

	var dbType = nconf.get('database'),
		testDbConfig = nconf.get('test_database'),
		productionDbConfig = nconf.get(dbType);

	if(!testDbConfig){
		errorText = 'test_database is not defined';
		winston.info(
			'\n===========================================================\n'+
			'Please, add parameters for test database in config.json\n'+
			'For example (redis):\n'+
				'"test_database": {' + '\n' +
				'    "host": "127.0.0.1",' + '\n' +
				'    "port": "6379",' + '\n' +
				'    "password": "",' + '\n' +
				'    "database": "1"' + '\n' +
			'}\n'+
			' or (mongo):\n' +
				'"test_database": {' + '\n' +
				'    "host": "127.0.0.1",' + '\n' +
				'    "port": "27017",' + '\n' +
				'    "password": "",' + '\n' +
				'    "database": "1"' + '\n' +
			'}\n'+
			' or (mongo) in a replicaset' + '\n' +
			'"test_database": {' + '\n' +
		    '    "host": "127.0.0.1,127.0.0.1,127.0.0.1",' + '\n' +
		    '    "port": "27017,27018,27019",' + '\n' +
		    '    "username": "",' + '\n' +
		    '    "password": "",' + '\n' +
		    '    "database": "nodebb_test"' + '\n' +
		    '}\n'+
			'==========================================================='
		);
		winston.error(errorText);
		throw new Error(errorText);
	}

	if(	testDbConfig.database === productionDbConfig.database &&
		testDbConfig.host === productionDbConfig.host &&
		testDbConfig.port === productionDbConfig.port
	){
		errorText = 'test_database has the same config as production db';
		winston.error(errorText);
		throw new Error(errorText);
	}

	nconf.set(dbType, testDbConfig);

	var db = require('../../src/database'),
		meta = require('../../src/meta');

	before(function(done) {
		db.init(function(err) {
			//Clean up
			db.flushdb(function(err) {
				if(err) {
					winston.error(err);
					throw new Error(err);
				}

				winston.info('test_database flushed');

				meta.configs.init(function () {
					nconf.set('url', nconf.get('base_url') + (nconf.get('use_port') ? ':' + nconf.get('port') : '') + nconf.get('relative_path'));
					nconf.set('core_templates_path', path.join(__dirname, '../../src/views'));
					nconf.set('base_templates_path', path.join(nconf.get('themes_path'), 'nodebb-theme-vanilla/templates'));
					nconf.set('theme_templates_path', meta.config['theme:templates'] ? path.join(nconf.get('themes_path'), meta.config['theme:id'], meta.config['theme:templates']) : nconf.get('base_templates_path'));

					var	webserver = require('../../src/webserver'),
						sockets = require('../../src/socket.io');
						sockets.init(webserver.server);

					done();
				});
			});
		});
	});

	module.exports = db;

}(module));
