import {
  Get,
  Body,
  Controller,
  Injectable,
  Post,
  UseGuards,
  ValidationPipe,
  UsePipes,
  UseInterceptors,
  Delete,
  Query,
} from '@nestjs/common';
import {
  ApiBearerAuth,
  ApiOkResponse,
  ApiOperation,
  ApiTags,
} from '@nestjs/swagger';
import { NotifierService } from './notifier.service';
import { NotificationEntity } from '../entities/notification.entity';
import {
  ApiOkResponseListWithMore,
  ApiResultListWithMore,
} from '../common/types/api-result';
import { RequestUser } from '../common/request-user';
import { UserDTO } from '../dto/user-dto';
import {
  NotificationDTO,
  NotificationReadRequest,
  NotificationReadResultDTO,
  NotificationsGetQueryDTO,
} from './dto/notification-dto';
import { JwtAuthGuard } from '../common/guards/jwt.auth.guard';

@ApiTags('notifier')
@Controller('notifier')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
@Injectable()
export class NotifierController {
  constructor(private readonly notifierService: NotifierService) {}
  @Get('notifications')
  @ApiOperation({
    summary: 'Get notifications',
  })
  @ApiOkResponseListWithMore(NotificationEntity)
  @UsePipes(
    new ValidationPipe({
      transform: true,
      transformOptions: { enableImplicitConversion: true },
    }),
  )
  async getNotifications(
    @RequestUser() account: UserDTO,
    @Query() filterData: NotificationsGetQueryDTO,
  ): Promise<ApiResultListWithMore<NotificationDTO>> {
    const res = await this.notifierService.getNotifications(account, filterData);
    return res;
  }

  @Post('notifications/read')
  @ApiOperation({
    summary: 'Read notifications',
  })
  @ApiOkResponse({
    type: NotificationReadResultDTO,
  })
  @UsePipes(
    new ValidationPipe({
      transform: true,
      transformOptions: { enableImplicitConversion: true },
    }),
  )
  async readNotifications(
    @RequestUser() account: UserDTO,
    @Body() body: NotificationReadRequest,
  ): Promise<NotificationReadResultDTO> {
    const res = await this.notifierService.readNotifications(
      account,
      body.where,
    );
    return res;
  }

  @Delete('notifications')
  @ApiOperation({
    summary: 'Delete notifications',
  })
  @ApiOkResponse({
    type: NotificationReadResultDTO,
  })
  @UsePipes(
    new ValidationPipe({
      transform: true,
      transformOptions: { enableImplicitConversion: true },
    }),
  )
  async deleteNotifications(
    @RequestUser() account: UserDTO,
    @Body() body: NotificationReadRequest,
  ): Promise<NotificationReadResultDTO> {
    const res = await this.notifierService.deleteNotifications(
      account,
      body.where,
    );
    return res;
  }
}
