'use strict';

var plugins = require('../plugins');
var meta = require('../meta');
var user = require('../user');
var pubsub = require('../pubsub');

var adminHomePageRoute;
var getRoute;

function configUpdated() {
	adminHomePageRoute = (meta.config.homePageRoute || meta.config.homePageCustom || '').replace(/^\/+/, '') || 'categories';
	getRoute = parseInt(meta.config.allowUserHomePage, 10) ? getRouteAllowUserHomePage : getRouteDisableUserHomePage;
}

function getRouteDisableUserHomePage(uid, next) {
	next(null, adminHomePageRoute);
}

function getRouteAllowUserHomePage(uid, next) {
	user.getSettings(uid, function (err, settings) {
		if (err) {
			return next(err);
		}

		var route = adminHomePageRoute;

		if (settings.homePageRoute !== 'undefined' && settings.homePageRoute !== 'none') {
			route = settings.homePageRoute || route;
		}

		next(null, route);
	});
}

pubsub.on('config:update', configUpdated);
configUpdated();

function rewrite(req, res, next) {
	if (req.path !== '/' && req.path !== '/api/' && req.path !== '/api') {
		return next();
	}

	getRoute(req.uid, function (err, route) {
		if (err) {
			return next(err);
		}

		var hook = 'action:homepage.get:' + route;

		if (!plugins.hasListeners(hook)) {
			req.url = req.path + (!req.path.endsWith('/') ? '/' : '') + route;
		} else {
			res.locals.homePageRoute = route;
		}

		next();
	});
}

exports.rewrite = rewrite;

function pluginHook(req, res, next) {
	var hook = 'action:homepage.get:' + res.locals.homePageRoute;

	plugins.fireHook(hook, {
		req: req,
		res: res,
		next: next,
	});
}

exports.pluginHook = pluginHook;