import {
  Controller,
  Post,
  Body,
  Res,
  HttpCode,
  HttpStatus,
  UseGuards,
  UsePipes,
  ValidationPipe,
} from '@nestjs/common';
import { Response } from 'express';
import { ApiTags, ApiOperation, ApiBearerAuth, ApiSecurity, ApiBody } from '@nestjs/swagger';
import { ResponseService } from 'src/common/response-handling/response-handler';
import { handleControllerError } from 'src/common/utils/controller-response-handling';
import { RolesGuard } from 'src/common/guards/roles.guard';
import { CombinedAuthGuard } from 'src/auth/combined-auth.guard';
import { ZoomJwtService } from '../services/zoom-jwt.service';
import { GenerateJoinTokenDto } from '../dto/generate-join-token.dto';
import { ZoomSdkRole } from '../enums/zoom-role.enum';
import { ZOOM_SWAGGER } from 'src/common/constants/zoom.constants';

@ApiTags(ZOOM_SWAGGER.TAG)
@Controller('zoom/token')
@UseGuards(CombinedAuthGuard, RolesGuard)
@ApiBearerAuth('Authorization')
@ApiSecurity('userIdAuth')
@ApiSecurity('activeRoleAuth')
export class ZoomTokenController {
  constructor(
    private readonly jwtService: ZoomJwtService,
    private readonly responseService: ResponseService,
  ) {}

  @Post('join')
  @HttpCode(HttpStatus.OK)
  @UsePipes(new ValidationPipe({ transform: true, whitelist: true }))
  @ApiOperation({ summary: ZOOM_SWAGGER.JOIN_TOKEN })
  @ApiBody({ type: GenerateJoinTokenDto })
  async join(@Body() dto: GenerateJoinTokenDto, @Res() res: Response) {
    try {
      const signature = this.jwtService.generateJoinToken(
        dto.meetingNumber,
        dto.role ?? ZoomSdkRole.ATTENDEE,
      );
      await this.responseService.success(res, 'Zoom join token generated', { signature });
    } catch (error) {
      handleControllerError(res, error);
    }
  }
}
