import { Controller, Post, Req, UseGuards } from '@nestjs/common';
import { ApiOperation, ApiSecurity, ApiTags } from '@nestjs/swagger';
import { CronAuthGuard } from '../../common/guards/cron-auth.guard';
import { ApiCronErrorResponses } from '../../common/swagger/api-error-responses.decorator';
import { ApiEnvelopeOkResponse } from '../../common/swagger/api-success-responses.decorator';
import { CronJobRunResponseDto } from '../../common/swagger/response-models.dto';
import { InternalCronService } from './internal-cron.service';

@ApiTags('Internal Cron')
@ApiSecurity('cron-secret')
@UseGuards(CronAuthGuard)
@Controller('internal/cron')
export class InternalCronController {
  constructor(private readonly internalCronService: InternalCronService) {}

  @Post('monthly/generate')
  @ApiOperation({ summary: 'Run monthly campaign generation job' })
  @ApiEnvelopeOkResponse(CronJobRunResponseDto, 'Monthly campaign generation job result')
  @ApiCronErrorResponses()
  monthlyGenerate(@Req() req: { ip?: string }) {
    return this.internalCronService.runMonthlyGenerate(req.ip);
  }

  @Post('campaigns/generate-recurring')
  @ApiOperation({ summary: 'Run recurring campaign generation job' })
  @ApiEnvelopeOkResponse(CronJobRunResponseDto, 'Recurring campaign generation job result')
  @ApiCronErrorResponses()
  recurringGenerate(@Req() req: { ip?: string }) {
    return this.internalCronService.runRecurringGenerate(req.ip);
  }

  @Post('monthly/reminders')
  @ApiOperation({ summary: 'Run monthly reminder dispatch job' })
  @ApiEnvelopeOkResponse(CronJobRunResponseDto, 'Monthly reminder job result')
  @ApiCronErrorResponses()
  monthlyReminders(@Req() req: { ip?: string }) {
    return this.internalCronService.runMonthlyReminders(req.ip);
  }

  @Post('annual/reminders')
  @ApiOperation({ summary: 'Run annual reminder dispatch job' })
  @ApiEnvelopeOkResponse(CronJobRunResponseDto, 'Annual reminder job result')
  @ApiCronErrorResponses()
  annualReminders(@Req() req: { ip?: string }) {
    return this.internalCronService.runAnnualReminders(req.ip);
  }

  @Post('assignments/lock-expired')
  @ApiOperation({ summary: 'Lock expired assignments' })
  @ApiEnvelopeOkResponse(CronJobRunResponseDto, 'Expired assignment lock job result')
  @ApiCronErrorResponses()
  lockExpired(@Req() req: { ip?: string }) {
    return this.internalCronService.lockExpiredAssignments(req.ip);
  }
}
