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 { QueryDashboardSummaryDto } from './dto/query-dashboard-summary.dto';
import { DashboardService, DashboardSummary } from './dashboard.service';

// CASL subject that guards the dashboard screen. A role needs the
// "read Dashboard" permission to reach these endpoints.
const DASHBOARD_SUBJECT = 'Dashboard';

@ApiTags('dashboard')
@ApiBearerAuth('access-token')
@UseGuards(JwtAuthGuard, PoliciesGuard)
@Controller('dashboard')
export class DashboardController {
  constructor(private readonly dashboardService: DashboardService) {}

  // Each dashboard screen gets its own route under /dashboard. This one
  // feeds the Working Group dashboard; a future /dashboard/plenary route
  // will feed the Plenary dashboard.
  @Get('working-group')
  @HttpCode(HttpStatus.OK)
  @CheckPolicies((ability: AppAbility) =>
    ability.can(Action.Read, DASHBOARD_SUBJECT),
  )
  @ApiOperation({
    summary: 'Working group dashboard: summary cards and chart data',
  })
  @ApiResponse({ status: 200, description: 'Dashboard summary counts' })
  @ApiResponse({ status: 400, description: 'Invalid query parameters' })
  @ApiResponse({ status: 403, description: 'Insufficient permissions' })
  getWorkingGroupSummary(
    @Query() query: QueryDashboardSummaryDto,
  ): Promise<DashboardSummary> {
    return this.dashboardService.getWorkingGroupSummary(query);
  }
}
