import {
  Args,
  Context,
  ID,
  Parent,
  Query,
  Resolver,
  Subscription,
} from '@nestjs/graphql';
import { Cat } from '../types/cat';
import { CatService } from '../services/cat.service';
import { ParseIntPipe } from '@nestjs/common';
import { LoaderQuery, ResolveLoader, toAsyncIterator } from '../../../lib';
import { PubSub } from 'mercurius';

@Resolver(() => Cat)
export class CatResolver {
  constructor(private readonly catService: CatService) {}

  @Query(() => [Cat])
  cats() {
    return this.catService.cats();
  }

  @Query(() => Cat, { nullable: true })
  cat(@Args({ name: 'id', type: () => ID }, ParseIntPipe) id: number) {
    return this.catService.cat(id);
  }

  @ResolveLoader(() => Boolean)
  hasFur(@Parent() queries: LoaderQuery<Cat>[]) {
    return queries.map(({ obj }) => obj.lives > 1);
  }

  @Subscription(() => Cat, {
    resolve: (payload) => payload,
  })
  onCatSub(@Context('pubsub') pubSub: PubSub) {
    return toAsyncIterator(pubSub.subscribe('CAT_SUB_TOPIC'));
  }
}