import { Controller, Get, UseGuards, Request, Param } from '@nestjs/common';
import {
  Crud, CrudOptions, CrudController, CrudAuth,
  CrudRequest, ParsedRequest, ParsedBody, Override
} from '@nestjsx/crud';
import { PostEntity } from './posts.entity';
import { PostsService } from './posts.service';
import { JwtAuthGuard } from 'src/auth/jwt-auth.guard';
import { UserEntity } from 'src/user/user.entity';
import { IsOwnerGuard } from 'src/guards/is-owner.guard';
// import { IsOwnerGuard } from 'src/'

@Crud({
  model: {
    type: PostEntity,
  },
  routes: {
    only: ['createOneBase', 'updateOneBase', 'deleteOneBase'],
  },
  params: {
    limit: 10,
    page: 1,
  },
  query: {
    limit: 10,
    alwaysPaginate: true,
    join: {
      // tslint:disable-next-line: object-literal-key-quotes
      comments: {
        eager: true,
      },
      'comments.user': {
        eager: true,
      },
      // tslint:disable-next-line: object-literal-key-quotes
      likes: {
        eager: true,
      },
    },
  },
} as CrudOptions)
// @UseGuards(JwtAuthGuard)
@Controller('posts')
export class PostsController implements CrudController<PostEntity> {
  constructor(public service: PostsService) { }

  get base(): any {
    return this;
  }

  @Override()
  @UseGuards(JwtAuthGuard)
  createOne(
    @Request() req: Express.Request,
    @ParsedRequest() pReq: CrudRequest,
    @ParsedBody() body: Partial<PostEntity>) {
    console.log({ user: (req as any).user, create: true });
    const obj = { ...body, user_id: (req as any).user.id };
    return this.base.createOneBase(pReq, obj);
  }

  @Override('updateOneBase')
  @UseGuards(JwtAuthGuard, IsOwnerGuard)
  updateOne(
    @Request() req: Express.Request,
    @Param('id') id: number,
    @ParsedRequest() pReq: CrudRequest,
    @ParsedBody() body: Partial<PostEntity>) {
    console.log({ user: (req as any).user, update: true, id });
    const obj = { ...body, user_id: (req as any).user.id };
    return this.base.updateOneBase(pReq, obj);
  }
}