import {
  Controller,
  DefaultValuePipe,
  Delete,
  Get,
  HttpCode,
  HttpStatus,
  Param,
  ParseIntPipe,
  Patch,
  Post,
  Query,
  Req,
  UseGuards,
} from '@nestjs/common';
import {
  ApiBearerAuth,
  ApiConflictResponse,
  ApiOkResponse,
  ApiTags,
} from '@nestjs/swagger';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import type { RequestAutenticado } from '../auth/jwt-auth.guard';
import { MembersService } from './members.service';

@ApiTags('Participantes')
@ApiBearerAuth()
@UseGuards(JwtAuthGuard)
@Controller('pools/:poolId/members')
export class MembersController {
  constructor(private readonly members: MembersService) {}

  @Get()
  @ApiOkResponse({ description: 'participantes, com quem saiu marcado' })
  listar(
    @Param('poolId') poolId: string,
    @Req() req: RequestAutenticado,
    @Query('limit', new DefaultValuePipe(50), ParseIntPipe) limit: number,
    @Query('offset', new DefaultValuePipe(0), ParseIntPipe) offset: number,
  ) {
    return this.members.listar(poolId, req.conta.id, limit, offset);
  }

  /** Quem falta palpitar na rodada — só o estado, nunca o placar (PP-9). */
  @Get('prediction-status/:matchday')
  @ApiOkResponse({
    description: 'estado de palpite por participante, sem placares',
  })
  statusDaRodada(
    @Param('poolId') poolId: string,
    @Param('matchday', ParseIntPipe) matchday: number,
    @Req() req: RequestAutenticado,
  ) {
    return this.members.statusDaRodada(poolId, matchday, req.conta.id);
  }

  @Patch(':userId/promote')
  @ApiConflictResponse({ description: 'já é admin' })
  promover(
    @Param('poolId') poolId: string,
    @Param('userId') alvoId: string,
    @Req() req: RequestAutenticado,
  ) {
    return this.members.promover(poolId, alvoId, req.conta.id);
  }

  @Patch(':userId/demote')
  @ApiConflictResponse({
    description: 'criador é admin permanente, ou bolão ficaria sem admin',
  })
  rebaixar(
    @Param('poolId') poolId: string,
    @Param('userId') alvoId: string,
    @Req() req: RequestAutenticado,
  ) {
    return this.members.rebaixar(poolId, alvoId, req.conta.id);
  }

  /** Saída voluntária. Definitiva: não há reentrada (CV-4). */
  @Post('leave')
  @HttpCode(HttpStatus.OK)
  sair(@Param('poolId') poolId: string, @Req() req: RequestAutenticado) {
    return this.members.sair(poolId, req.conta.id);
  }

  @Delete(':userId')
  @ApiConflictResponse({ description: 'criador não pode ser removido' })
  remover(
    @Param('poolId') poolId: string,
    @Param('userId') alvoId: string,
    @Req() req: RequestAutenticado,
  ) {
    return this.members.remover(poolId, alvoId, req.conta.id);
  }
}
