'use strict';

const validator = require('validator');
const nconf = require('nconf');

const meta = require('../meta');
const user = require('../user');
const categories = require('../categories');
const topics = require('../topics');
const privileges = require('../privileges');
const pagination = require('../pagination');
const utils = require('../utils');
const helpers = require('./helpers');

const tagsController = module.exports;

const url = nconf.get('url');

tagsController.getTag = async function (req, res) {
	const tag = validator.escape(utils.cleanUpTag(req.params.tag, meta.config.maximumTagLength));
	const page = parseInt(req.query.page, 10) || 1;
	const cid = Array.isArray(req.query.cid) || !req.query.cid ? req.query.cid : [req.query.cid];

	const templateData = {
		topics: [],
		tag: tag,
		breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[tags:tags]]', url: '/tags' }, { text: tag }]),
		title: `[[pages:tag, ${tag}]]`,
	};
	const [settings, cids, categoryData, canPost, isPrivileged, rssToken, isFollowing] = await Promise.all([
		user.getSettings(req.uid),
		cid || categories.getCidsByPrivilege('categories:cid', req.uid, 'topics:read'),
		helpers.getSelectedCategory(cid),
		privileges.categories.canPostTopic(req.uid),
		user.isPrivileged(req.uid),
		user.auth.getFeedToken(req.uid),
		topics.isFollowingTag(req.params.tag, req.uid),
	]);
	const start = Math.max(0, (page - 1) * settings.topicsPerPage);
	const stop = start + settings.topicsPerPage - 1;

	const [topicCount, tids] = await Promise.all([
		topics.getTagTopicCount(tag, cids),
		topics.getTagTidsByCids(tag, cids, start, stop),
	]);

	templateData.topics = await topics.getTopics(tids, req.uid);
	templateData.canPost = canPost;
	templateData.showSelect = isPrivileged;
	templateData.showTopicTools = isPrivileged;
	templateData.isFollowing = isFollowing;
	templateData.allCategoriesUrl = `tags/${tag}${helpers.buildQueryString(req.query, 'cid', '')}`;
	templateData.selectedCategory = categoryData.selectedCategory;
	templateData.selectedCids = categoryData.selectedCids;
	topics.calculateTopicIndices(templateData.topics, start);
	res.locals.metaTags = [
		{
			name: 'title',
			content: tag,
		},
		{
			property: 'og:title',
			content: tag,
		},
	];

	const pageCount = Math.max(1, Math.ceil(topicCount / settings.topicsPerPage));
	templateData.pagination = pagination.create(page, pageCount, req.query);
	helpers.addLinkTags({
		url: `tags/${tag}`,
		res: req.res,
		tags: templateData.pagination.rel,
		page: page,
	});

	templateData['feeds:disableRSS'] = meta.config['feeds:disableRSS'];
	if (!meta.config['feeds:disableRSS']) {
		templateData.rssFeedUrl = `${nconf.get('relative_path')}/tags/${tag}.rss`;
		if (req.loggedIn) {
			templateData.rssFeedUrl += `?uid=${req.uid}&token=${rssToken}`;
		}
	}

	res.render('tag', templateData);
};

tagsController.getTags = async function (req, res) {
	const cids = await categories.getCidsByPrivilege('categories:cid', req.uid, 'topics:read');
	const [canSearch, tags] = await Promise.all([
		privileges.global.can('search:tags', req.uid),
		topics.getCategoryTagsData(cids, 0, 99),
	]);

	res.locals.linkTags = [
		{
			rel: 'canonical',
			href: `${url}/tags`,
		},
	];

	res.render('tags', {
		tags: tags.filter(Boolean),
		displayTagSearch: canSearch,
		nextStart: 100,
		breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[tags:tags]]' }]),
		title: '[[pages:tags]]',
	});
};
