"use strict";



var async = require('async');
var plugins = require('../plugins');
var db = require('../database');
var translator = require('../../public/src/modules/translator');
var pubsub = require('../pubsub');

var admin = {};
admin.cache = null;

pubsub.on('admin:navigation:save', function () {
	admin.cache = null;
});

admin.save = function (data, callback) {
	var order = Object.keys(data);
	var items = data.map(function (item, idx) {
		var data = {};

		for (var i in item) {
			if (item.hasOwnProperty(i)) {
				item[i] = typeof item[i] === 'string' ? translator.escape(item[i]) : item[i];
			}
		}

		data[idx] = item;
		return JSON.stringify(data);
	});

	admin.cache = null;
	pubsub.publish('admin:navigation:save');
	async.waterfall([
		function (next) {
			db.delete('navigation:enabled', next);
		},
		function (next) {
			db.sortedSetAdd('navigation:enabled', order, items, next);
		}
	], callback);
};

admin.getAdmin = function (callback) {
	async.parallel({
		enabled: admin.get,
		available: getAvailable
	}, callback);
};

admin.get = function (callback) {
	db.getSortedSetRange('navigation:enabled', 0, -1, function (err, data) {
		if (err) {
			return callback(err);
		}

		data = data.map(function (item, idx) {
			return JSON.parse(item)[idx];
		});

		callback(null, data);
	});
};

function getAvailable(callback) {
	var core = require('../../install/data/navigation.json').map(function (item) {
		item.core = true;
		return item;
	});

	plugins.fireHook('filter:navigation.available', core, callback);
}

module.exports = admin;