import { Body, Controller, Post, UseGuards, Request, Query, Get, Patch, Param } from '@nestjs/common';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { CallService } from './call.service';
import { AuthGuard } from 'src/auth/auth.guard';
import { AcceptRejectDto, MakeCallDto, UpdateCallStatusApiDto } from './dto/call.dto';
import { CallGateway } from './call.gateway';
import { Public } from 'src/auth/public.decorator';

@ApiTags('Call')
@Controller('call')
export class CallController {
    constructor(
        private readonly agoraService: CallService,
        private readonly callGateway: CallGateway,
    ) { }


    @UseGuards(AuthGuard)
    @ApiBearerAuth('access_token')
    @Post('make')
    @ApiOperation({ summary: 'Generate an Agora token for joining a video call session' })
    async makeCall(@Body() dto: MakeCallDto, @Request() req: any) {
        try {
            const data = await this.agoraService.makeCall(req,dto);
            return {
                success: true,
                message: 'Token has been successfully generated',
                data,
            };
        } catch (err) {
            throw err;
        }
    }


    @UseGuards(AuthGuard)
    @Public()
    @ApiBearerAuth('access_token')
    @Post('update-call-status')
    @ApiOperation({ summary: 'Generate an Agora token for joining a video call session' })
    async updateCallStatus(@Body() dto: UpdateCallStatusApiDto, @Request() req: any) {
        try {
            let user_id = req?.user_data?._id;
            if(!user_id) user_id =dto.user_id
            const data = await this.callGateway.acceptRejectCall(user_id,dto);
            return {
                success: true,
                message: 'Call status has been successfully updated',
                data,
            };
        } catch (err) {
            throw err;
        }
    }

}

