'use strict';

const assert = require('assert');

const db = require('../mocks/databasemock');

const user = require('../../src/user');
const categories = require('../../src/categories');
const topics = require('../../src/topics');
const utils = require('../../src/utils');

describe('Topic tools', () => {
	describe('Topic moving', () => {
		let cid1;
		let cid2;
		let tid;
		let uid;

		before(async () => {
			({ cid: cid1 } = await categories.create({ name: utils.generateUUID().slice(0, 8) }));
			({ cid: cid2 } = await categories.create({ name: utils.generateUUID().slice(0, 8) }));

			uid = await user.create({ username: utils.generateUUID().slice(0, 8) });
			const { topicData } = await topics.post({
				uid,
				cid: cid1,
				title: utils.generateUUID(),
				content: utils.generateUUID(),
			});
			tid = topicData.tid;
		});

		it('should not error when moving a topic from one cid to another', async () => {
			await topics.tools.move(tid, {
				cid: cid2,
				uid,
			});
		});

		it('should reflect the topic in the new category', async () => {
			const tids = await categories.getTopicIds({
				uid,
				cid: cid2,
				start: 0,
				stop: 1,
			});

			assert(Array.isArray(tids));
			assert.deepStrictEqual(tids, [String(tid)]);
		});

		it('should NOT reflect the topic in the old category', async () => {
			const tids = await categories.getTopicIds({
				uid,
				cid: cid1,
				start: 0,
				stop: 1,
			});

			assert(Array.isArray(tids));
			assert.deepStrictEqual(tids, []);
		});
	});

	describe('with remote categories', () => {
		let remoteCid;
		let localCid;
		let tid1;
		let tid2;

		before(async () => {
			const helpers = require('../activitypub/helpers');
			({ id: remoteCid } = helpers.mocks.group());
			({ cid: localCid } = await categories.create({ name: utils.generateUUID().slice(0, 8) }));

			({ id: tid1 } = helpers.mocks.note({
				audience: remoteCid,
			}));
			const uid = await user.create({ username: utils.generateUUID().slice(0, 8) });
			const { topicData } = await topics.post({
				uid,
				cid: localCid,
				title: utils.generateUUID(),
				content: utils.generateUUID(),
			});
			tid2 = topicData.tid;
		});

		it('should throw when attempting to move a topic from a remote category', async () => {
			await assert.rejects(
				topics.tools.move(tid1, {
					cid: localCid,
					uid: 'system',
				}),
				{ message: '[[error:no-topic]]' }
			);
		});

		it('should throw when attempting to move a topic to a remote category', async () => {
			await assert.rejects(
				topics.tools.move(tid2, {
					cid: remoteCid,
					uid: 'system',
				}),
				{ message: '[[error:cant-move-topic-to-from-remote-categories]]' }
			);
		});
	});
});