import {
  Body,
  Controller,
  Get,
  Param,
  ParseIntPipe,
  Patch,
  Post,
  Query,
  Req,
  UseGuards,
} from '@nestjs/common';
import { JwtAuthGuard } from '@/auth/guards/jwt-auth/jwt-auth.guard';
import { ChatService } from './chat.service';
import { SendMessageDto } from './dto/send-message.dto';
import { ReactMessageDto } from './dto/react-message.dto';

@UseGuards(JwtAuthGuard)
@Controller('chat')
export class ChatController {
  constructor(private readonly chatService: ChatService) {}

  @Get('groups/:groupId')
  getConversation(@Param('groupId') groupId: string, @Req() req) {
    return this.chatService.getConversation(groupId, req.user.id);
  }

  @Get('groups/:groupId/messages')
  messages(
    @Param('groupId') groupId: string,
    @Req() req,
    @Query('page', new ParseIntPipe({ optional: true })) page = 1,
    @Query('limit', new ParseIntPipe({ optional: true })) limit = 30,
  ) {
    return this.chatService.messages(groupId, req.user.id, page, limit);
  }

  @Post('groups/:groupId/messages')
  send(
    @Param('groupId') groupId: string,
    @Req() req,
    @Body() dto: SendMessageDto,
  ) {
    return this.chatService.send(groupId, req.user.id, dto.content);
  }

  @Patch('groups/:groupId/read')
  read(@Param('groupId') groupId: string, @Req() req) {
    return this.chatService.markRead(groupId, req.user.id);
  }

  @Post('messages/:messageId/reactions')
  react(
    @Param('messageId') messageId: string,
    @Req() req,
    @Body() dto: ReactMessageDto,
  ) {
    return this.chatService.react(messageId, req.user.id, dto.emoji);
  }

  @Patch('messages/:messageId/pin')
  pin(@Param('messageId') messageId: string, @Req() req) {
    return this.chatService.pin(messageId, req.user.id);
  }
}
