import { Controller, Get, Param, Query, UseGuards } from '@nestjs/common';
import {
  ApiBearerAuth,
  ApiOperation,
  ApiParam,
  ApiTags,
} from '@nestjs/swagger';
import { AppPermission } from '@aechr/shared';
import { Permissions as PermissionsDecorator } from '../../common/decorators/permissions.decorator';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import { ApiJwtErrorResponses } from '../../common/swagger/api-error-responses.decorator';
import { ApiArrayEnvelopeOkResponse, ApiEnvelopeOkResponse } from '../../common/swagger/api-success-responses.decorator';
import {
  AssignmentResponseDto,
  CampaignSummaryReportResponseDto,
  EmployeeHistoryResponseDto,
  ExportPayloadResponseDto,
} from '../../common/swagger/response-models.dto';
import { ReportsQueryDto } from './dto/reports-query.dto';
import { ReportsService } from './reports.service';

@ApiTags('Reports')
@ApiBearerAuth()
@UseGuards(JwtAuthGuard)
@PermissionsDecorator(AppPermission.REPORTS_READ)
@Controller('reports')
export class ReportsController {
  constructor(private readonly reportsService: ReportsService) {}

  @Get('monthly-summary')
  @ApiOperation({ summary: 'Get monthly campaign summary report' })
  @ApiEnvelopeOkResponse(CampaignSummaryReportResponseDto, 'Monthly summary report payload')
  @ApiJwtErrorResponses()
  monthlySummary(@Query() query: ReportsQueryDto) {
    return this.reportsService.monthlySummary(query.periodMonth, query.periodYear);
  }

  @Get('annual-summary')
  @ApiOperation({ summary: 'Get annual campaign summary report' })
  @ApiEnvelopeOkResponse(CampaignSummaryReportResponseDto, 'Annual summary report payload')
  @ApiJwtErrorResponses()
  annualSummary(@Query() query: ReportsQueryDto) {
    return this.reportsService.annualSummary(query.periodYear);
  }

  @Get('pending-submissions')
  @ApiOperation({ summary: 'List pending submissions report' })
  @ApiArrayEnvelopeOkResponse(AssignmentResponseDto, 'Pending submissions report payload')
  @ApiJwtErrorResponses()
  pendingSubmissions(@Query() query: ReportsQueryDto) {
    return this.reportsService.pendingSubmissions(query.periodMonth, query.periodYear);
  }

  @Get('employee-history/:employeeId')
  @ApiOperation({ summary: 'Get one employee assessment history' })
  @ApiParam({ name: 'employeeId', description: 'Employee user identifier' })
  @ApiEnvelopeOkResponse(EmployeeHistoryResponseDto, 'Employee assessment history payload')
  @ApiJwtErrorResponses({ notFound: 'Employee was not found' })
  employeeHistory(@Param('employeeId') employeeId: string) {
    return this.reportsService.employeeHistory(employeeId);
  }

  @Get('export/monthly')
  @ApiOperation({ summary: 'Get monthly export payload' })
  @ApiEnvelopeOkResponse(ExportPayloadResponseDto, 'Export-friendly monthly report payload')
  @ApiJwtErrorResponses()
  exportMonthly(@Query() query: ReportsQueryDto) {
    return this.reportsService.exportMonthly(query.periodMonth, query.periodYear);
  }

  @Get('export/annual')
  @ApiOperation({ summary: 'Get annual export payload' })
  @ApiEnvelopeOkResponse(ExportPayloadResponseDto, 'Export-friendly annual report payload')
  @ApiJwtErrorResponses()
  exportAnnual(@Query() query: ReportsQueryDto) {
    return this.reportsService.exportAnnual(query.periodYear);
  }
}
