import {
  Controller,
  Get,
  HttpCode,
  HttpStatus,
  Query,
  UseGuards,
} from '@nestjs/common';
import {
  ApiBearerAuth,
  ApiOperation,
  ApiResponse,
  ApiTags,
} from '@nestjs/swagger';

import { Action } from '@/casl/action.enum';
import { AppAbility } from '@/casl/casl-ability.factory';
import { CheckPolicies } from '@/casl/check-policies.decorator';
import { PoliciesGuard } from '@/casl/policies.guard';
import { JwtAuthGuard } from '@/modules/auth/jwt-auth.guard';
import { CefpQueryIssueDto } from './dto/cefp-query-issue.dto';
import {
  type CefpIssueMatrixSummary,
  type PaginatedCefpIssueMatrix,
} from './cefp-issue-matrix.service';
import { CefpIssueMatrixService } from './cefp-issue-matrix.service';

const CEFP_ISSUE_MATRIX_SUBJECT = 'CefpIssueMatrix';

@ApiTags('cefp-issue-matrix')
@ApiBearerAuth('access-token')
@UseGuards(JwtAuthGuard, PoliciesGuard)
@Controller('cefp-issue-matrix')
export class CefpIssueMatrixController {
  constructor(
    private readonly cefpIssueMatrixService: CefpIssueMatrixService,
  ) {}

  @Get()
  @HttpCode(HttpStatus.OK)
  @CheckPolicies((ability: AppAbility) =>
    ability.can(Action.Read, CEFP_ISSUE_MATRIX_SUBJECT),
  )
  @ApiOperation({
    summary: 'List latest unresolved issues escalated to CEFP',
  })
  @ApiResponse({
    status: 200,
    description: 'Paginated CEFP issue matrix',
  })
  findAll(
    @Query() query: CefpQueryIssueDto,
  ): Promise<PaginatedCefpIssueMatrix> {
    return this.cefpIssueMatrixService.findAll(query);
  }

  @Get('summary')
  @HttpCode(HttpStatus.OK)
  @CheckPolicies((ability: AppAbility) =>
    ability.can(Action.Read, CEFP_ISSUE_MATRIX_SUBJECT),
  )
  @ApiOperation({
    summary: 'Get CEFP issue matrix summary counts',
  })
  @ApiResponse({
    status: 200,
    description: 'CEFP issue matrix summary',
  })
  getSummary(): Promise<CefpIssueMatrixSummary> {
    return this.cefpIssueMatrixService.getSummary();
  }
}
