import { Q } from '@nozbe/watermelondb';

import { IServerSubscription, IServerRoom } from '../../../definitions';
import database from '../../database';

export default async (subscriptions: IServerSubscription[], rooms: IServerRoom[]) => {
	let sub = subscriptions;
	let room = rooms;
	try {
		const db = database.active;
		const subCollection = db.get('subscriptions');

		const roomIds = rooms.filter(r => !subscriptions.find(s => s.rid === r._id)).map(r => r._id);
		const existingSubs = await subCollection.query(Q.where('rid', Q.oneOf(roomIds))).fetch();
		const mappedExistingSubs = existingSubs.map(s => ({
			_id: s._id,
			f: s.f,
			t: s.t,
			ts: s.ts,
			ls: s.ls,
			name: s.name,
			fname: s.fname,
			rid: s.rid,
			open: s.open,
			alert: s.alert,
			unread: s.unread,
			userMentions: s.userMentions,
			roomUpdatedAt: s.roomUpdatedAt,
			ro: s.ro,
			lastOpen: s.lastOpen,
			description: s.description,
			announcement: s.announcement,
			bannerClosed: s.bannerClosed,
			topic: s.topic,
			blocked: s.blocked,
			blocker: s.blocker,
			reactWhenReadOnly: s.reactWhenReadOnly,
			archived: s.archived,
			joinCodeRequired: s.joinCodeRequired,
			muted: s.muted,
			broadcast: s.broadcast,
			prid: s.prid,
			draftMessage: s.draftMessage,
			lastThreadSync: s.lastThreadSync,
			jitsiTimeout: s.jitsiTimeout,
			autoTranslate: s.autoTranslate,
			autoTranslateLanguage: s.autoTranslateLanguage,
			lastMessage: s.lastMessage,
			usernames: s.usernames,
			uids: s.uids,
			visitor: s.visitor,
			departmentId: s.departmentId,
			servedBy: s.servedBy,
			livechatData: s.livechatData,
			tags: s.tags,
			encrypted: s.encrypted,
			e2eKeyId: s.e2eKeyId,
			E2EKey: s.E2EKey,
			avatarETag: s.avatarETag
		}));
		// Assign
		sub = subscriptions.concat(mappedExistingSubs as unknown as IServerSubscription);

		const subsIds = subscriptions.filter(s => !rooms.find(r => s.rid === r._id)).map(s => s._id);
		const existingRooms = await subCollection.query(Q.where('id', Q.oneOf(subsIds))).fetch();
		const mappedExistingRooms = existingRooms.map(r => ({
			_updatedAt: r._updatedAt,
			lastMessage: r.lastMessage,
			description: r.description,
			topic: r.topic,
			announcement: r.announcement,
			reactWhenReadOnly: r.reactWhenReadOnly,
			archived: r.archived,
			joinCodeRequired: r.joinCodeRequired,
			jitsiTimeout: r.jitsiTimeout,
			usernames: r.usernames,
			uids: r.uids,
			ro: r.ro,
			broadcast: r.broadcast,
			muted: r.muted,
			sysMes: r.sysMes,
			v: r.v,
			departmentId: r.departmentId,
			servedBy: r.servedBy,
			livechatData: r.livechatData,
			tags: r.tags,
			encrypted: r.encrypted,
			e2eKeyId: r.e2eKeyId,
			avatarETag: r.avatarETag
		}));
		// Assign
		room = rooms.concat(mappedExistingRooms as unknown as IServerRoom);
	} catch {
		// do nothing
	}

	return {
		subscriptions: sub,
		rooms: room
	};
};