'use strict';

process.env.NODE_CONFIG_DIR = `${__dirname}/config`;

const async = require('async');
const fs = require('fs');

const db = require('./logic/db');
const app = require('./logic/app');
const mail = require('./logic/mail');
const api = require('./logic/api');
const io = require('./logic/io');
const stations = require('./logic/stations');
const songs = require('./logic/songs');
const playlists = require('./logic/playlists');
const cache = require('./logic/cache');
const notifications = require('./logic/notifications');
const logger = require('./logic/logger');
const tasks = require('./logic/tasks');
const config = require('config');

process.on('uncaughtException', err => {
	//console.log(`ERROR: ${err.message}`);
	console.log(`ERROR: ${err.stack}`);
});

async.waterfall([

	// setup our Redis cache
	(next) => {
		cache.init(config.get('redis').url, () => {
			next();
		});
	},

	// setup our MongoDB database
	(next) => db.init(config.get("mongo").url, next),

	// setup the express server
	(next) => app.init(next),

	// setup the mail
	(next) => mail.init(next),

	// setup the socket.io server (all client / server communication is done over this)
	(next) => io.init(next),

	// setup the notifications
	(next) => notifications.init(config.get('redis').url, next),

	// setup the stations
	(next) => stations.init(next),

	// setup the songs
	(next) => songs.init(next),

	// setup the playlists
	(next) => playlists.init(next),

	// setup the API
	(next) => api.init(next),

	// setup the logger
	(next) => logger.init(next),

	// setup the tasks system
	(next) => tasks.init(next),

	// setup the frontend for local setups
	(next) => {
		if (!config.get("isDocker")) {
			const express = require('express');
			const app = express();
			app.listen(80);
			const rootDir = __dirname.substr(0, __dirname.lastIndexOf("backend")) + "frontend\\build\\";

			app.get("/*", (req, res) => {
				const path = req.path;
				fs.access(rootDir + path, function(err) {
					if (!err) {
						res.sendFile(rootDir + path);
					} else {
						res.sendFile(rootDir + "index.html");
					}
				});
			});
		}
		next();
	}
], (err) => {
	if (err && err !== true) {
		console.error('An error occurred while initializing the backend server');
		console.error(err);
		process.exit();
	} else {
		console.info('Backend server has been successfully started');
	}
});