import { Context, Query, Resolver, Subscription } from '@nestjs/graphql';
import { GroupModel } from './models/group.model';
import { PrismaService } from '../prisma/prisma.service';
import { AgentFlags } from './models/agent.model';
import { Request } from 'express';
import { Inject, UseGuards } from '@nestjs/common';
import { AuthGuard } from '../auth/auth.guard';
import { Group } from '@prisma/client';
import { PubSub } from 'graphql-subscriptions';

@Resolver(() => GroupModel)
export class GroupResolver {
	constructor(
		@Inject('PUBSUB')
		private readonly pubSub: PubSub,
		private readonly prisma: PrismaService,
	) {}

	@Subscription(() => GroupModel, {
		filter: (payload: Group, variables, { req }: { req: Request }) => {
			return !!req.agent || req.group.id === payload.id;
		},
	})
	@UseGuards(AuthGuard)
	onGroupUpdate() {
		return this.pubSub.asyncIterator('onGroupUpdate');
	}

	@Query(() => [GroupModel])
	@UseGuards(AuthGuard)
	async getGroups(
		@Context() { req }: { req: Request },
	): Promise<GroupModel[]> {
		if (req.group) return [req.group];

		if (
			req.agent &&
			(req.agent.flags & AgentFlags.ADMIN) === AgentFlags.ADMIN
		)
			return this.prisma.group.findMany();

		return [];
	}
}