import { Body, Controller, Get, Param, Post, Query, UseGuards } from '@nestjs/common';
import {
  ApiBearerAuth,
  ApiOperation,
  ApiParam,
  ApiTags,
} from '@nestjs/swagger';
import { AppPermission } from '@aechr/shared';
import { CurrentUser } from '../../common/decorators/current-user.decorator';
import { Permissions as PermissionsDecorator } from '../../common/decorators/permissions.decorator';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import type { JwtAuthUser } from '../../common/interfaces/jwt-auth-user.interface';
import { ApiJwtErrorResponses } from '../../common/swagger/api-error-responses.decorator';
import {
  ApiEnvelopeOkResponse,
  ApiPaginatedEnvelopeOkResponse,
} from '../../common/swagger/api-success-responses.decorator';
import {
  ReminderLogResponseDto,
  ReminderRunSummaryResponseDto,
} from '../../common/swagger/response-models.dto';
import { RemindersService } from './reminders.service';

@ApiTags('Reminders')
@ApiBearerAuth()
@UseGuards(JwtAuthGuard)
@Controller('reminders')
export class RemindersController {
  constructor(private readonly remindersService: RemindersService) {}

  @Get('logs')
  @PermissionsDecorator(AppPermission.ASSIGNMENTS_READ)
  @ApiOperation({ summary: 'List reminder logs' })
  @ApiPaginatedEnvelopeOkResponse(ReminderLogResponseDto, 'Paginated reminder log list')
  @ApiJwtErrorResponses()
  listLogs(@Query() query: Record<string, string | undefined>) {
    return this.remindersService.listLogs({
      page: query.page ? Number(query.page) : undefined,
      limit: query.limit ? Number(query.limit) : undefined,
      includeDeleted: query.includeDeleted === 'true',
      assignmentId: query.assignmentId,
      deliveryStatus: query.deliveryStatus as never,
    });
  }

  @Post('send/:assignmentId')
  @PermissionsDecorator(AppPermission.ASSIGNMENTS_WRITE)
  @ApiOperation({ summary: 'Send a reminder for one assignment' })
  @ApiParam({ name: 'assignmentId', description: 'Assignment identifier' })
  @ApiEnvelopeOkResponse(ReminderLogResponseDto, 'Reminder dispatch result')
  @ApiJwtErrorResponses({ notFound: 'Assignment was not found' })
  send(@Param('assignmentId') assignmentId: string, @CurrentUser() user: JwtAuthUser) {
    return this.remindersService.sendReminderForAssignment(assignmentId, user);
  }

  @Post('run-pending')
  @PermissionsDecorator(AppPermission.ASSIGNMENTS_WRITE)
  @ApiOperation({ summary: 'Send pending reminders in bulk' })
  @ApiEnvelopeOkResponse(ReminderRunSummaryResponseDto, 'Pending reminder run result')
  @ApiJwtErrorResponses()
  runPending(
    @Body() body: { assessmentType?: 'MONTHLY' | 'ANNUAL' },
    @CurrentUser() user: JwtAuthUser,
  ) {
    return this.remindersService.runPendingReminders(user, body.assessmentType);
  }
}
