import { Controller, Get, Query, Post, Body, Req, Param } from '@nestjs/common';
import { NotificationService } from './notification.service';
import { ApiBearerAuth, ApiQuery, ApiTags, ApiOperation, ApiBody, ApiResponse } from '@nestjs/swagger';
import { AuthGuard } from 'src/auth/auth.guard';
import { UseGuards } from '@nestjs/common';
import { CreateBroadcastDto, GetBroadcastListDto } from './dto/broadcast.dto';
import { NotificationType } from './enums/notification-type.enum';

@ApiTags('Notifications')
@Controller('notification')
export class NotificationController {
  constructor(
    private readonly notificationService: NotificationService) {}

  @UseGuards(AuthGuard)
  @ApiBearerAuth('access_token')
  @Get('list')
  @ApiOperation({ summary: 'Get user notifications list with pagination' })
  @ApiQuery({ name: 'page', required: false, example: 1 })
  @ApiQuery({ name: 'limit', required: false, example: 20 })
  @ApiResponse({ status: 200, description: 'Notifications retrieved successfully' })
  async getNotifications(@Req() req: any, @Query('page') page: number = 1, @Query('limit') limit: number = 20) {
    const userId = req.user_data._id;
    return await this.notificationService.getNotificationsByUserId(page, limit, req);
  }

  @UseGuards(AuthGuard)
  @ApiBearerAuth('access_token')
  @Post('mark-all-read')
  @ApiOperation({ summary: 'Mark all notifications as read' })
  @ApiResponse({ status: 200, description: 'All notifications marked as read' })
  async markAllAsRead(@Req() req: any) {
    const userId = req.user_data._id;
    return await this.notificationService.markAllAsRead(userId);
  }

  @UseGuards(AuthGuard)
  @ApiBearerAuth('access_token')
  @Get('unread-count')
  @ApiOperation({ summary: 'Get unread notification count' })
  @ApiResponse({ status: 200, description: 'Unread count retrieved' })
  async getUnreadCount(@Req() req: any) {
    const userId = req.user_data._id;
    return await this.notificationService.getUnreadCount(userId);
  }

  @UseGuards(AuthGuard)
  @ApiBearerAuth('access_token')
  @Post('admin/broadcast')
  @ApiOperation({ summary: 'Create a new broadcast (Admin only)' })
  @ApiBody({ type: CreateBroadcastDto })
  @ApiResponse({ status: 201, description: 'Broadcast created successfully' })
  @ApiResponse({ status: 400, description: 'Bad request' })
  async createBroadcast(@Req() req: any, @Body() dto: CreateBroadcastDto) {
    return await this.notificationService.createBroadcast(dto, req.user_data._id);
  }

  @UseGuards(AuthGuard)
  @ApiBearerAuth('access_token')
  @Get('admin/broadcast/list')
  @ApiOperation({ summary: 'Get broadcast list with pagination (Admin only)' })
  @ApiResponse({ status: 200, description: 'Broadcast list retrieved successfully' })
  async getBroadcastList(@Req() req: any, @Query() queryDto: GetBroadcastListDto) {
    return await this.notificationService.getBroadcastList(queryDto, req.user_data._id);
  }

  @UseGuards(AuthGuard)
  @ApiBearerAuth('access_token')
  @Get('admin/broadcast/:id')
  @ApiOperation({ summary: 'Get broadcast by ID (Admin only)' })
  @ApiResponse({ status: 200, description: 'Broadcast retrieved successfully' })
  @ApiResponse({ status: 404, description: 'Broadcast not found' })
  async getBroadcastById(@Req() req: any, @Param('id') id: string) {
    return await this.notificationService.getBroadcastById(id, req.user_data._id);
  }

  @UseGuards(AuthGuard)
  @ApiBearerAuth('access_token')
  @Post('admin/broadcast/:id/retry')
  @ApiOperation({ summary: 'Retry failed broadcast (Admin only)' })
  @ApiResponse({ status: 201, description: 'Broadcast retry started' })
  @ApiResponse({ status: 404, description: 'Broadcast not found' })
  @ApiResponse({ status: 400, description: 'Bad request' })
  async retryFailedBroadcast(@Req() req: any, @Param('id') id: string) {
    return await this.notificationService.retryFailedBroadcast(id, req.user_data._id);
  }
}
