import { PrismaSelect } from '@paljs/plugins';
import { PrismaClient } from '@prisma/client';
import { Decimal } from '@prisma/client/runtime';
import { GraphQLResolveInfo } from 'graphql';

import { Profile } from '../../@generated/profile/profile.model';
import { AggregateUser } from '../../@generated/user/aggregate-user.output';
import { CreateManyUserArgs } from '../../@generated/user/create-many-user.args';
import { CreateOneUserArgs } from '../../@generated/user/create-one-user.args';
import { User } from '../../@generated/user/user.model';
import { UserAggregateArgs } from '../../@generated/user/user-aggregate.args';
import { UserCreateInput } from '../../@generated/user/user-create.input';
import { UserUpdateInput } from '../../@generated/user/user-update.input';
import { UserWhereInput } from '../../@generated/user/user-where.input';
import { UserDateInput } from './user-date.input';
import { Resolver, Query, Args, Mutation, Info } from '@nestjs/graphql';

const prisma = new PrismaClient({
  errorFormat: 'colorless',
  log: [
    {
      emit: 'event',
      level: 'query',
    },
  ],
});

prisma.$on('query', event => {
  console.log(event);
});

/**
 * Resolves user object type.
 */
@Resolver(() => User)
export class UserResolver {
  /**
   * Query for single user.
   */
  @Query(() => [User])
  async users(@Args('where') where: UserWhereInput, @Info() info: GraphQLResolveInfo) {
    const select = new PrismaSelect(info).value;
    // console.log('select', select);
    return await prisma.user.findMany({ where, ...select });
  }

  @Mutation(() => User, { nullable: true })
  async userUpdate(@Args('user') user: UserUpdateInput): Promise<any> {
    return;
  }

  @Mutation(() => User, { nullable: true })
  async userCreate(@Args('user') user: UserCreateInput): Promise<any> {
    return;
  }

  @Mutation(() => User, { nullable: true })
  async createOneUser(@Args() args: CreateOneUserArgs): Promise<any> {
    console.log('args', args);
    return;
  }

  @Mutation(() => User, { nullable: true })
  async userInfo(@Args('user') user: UserDateInput): Promise<any> {
    console.log('userInfo Args', user.date, typeof user.date, user.date?.constructor);
    return;
  }

  @Mutation(() => [User], { nullable: true })
  async createManyUsers(@Args() createManyUserArgs: CreateManyUserArgs): Promise<any> {
    console.log('createManyUserArgs', createManyUserArgs);
    return;
  }

  @Query(() => AggregateUser)
  userAggregate(@Args() args: UserAggregateArgs) {
    return prisma.user.aggregate(args);
  }

  @Query(() => Profile)
  queryProfile() {
    const p = new Profile();
    p.id = 1;
    return p;
  }
}