import { Body, Controller, Get, Param, ParseUUIDPipe, Patch, Query, UseGuards, ValidationPipe } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { AlertasEmpresaService } from './alertas-empresa.service';
import { PopupMostradaDto } from './dto/popup-mostrada.dto';

/**
 * Alertas de la empresa para el usuario logueado. Ver docs/plan-alertas-empresa.md.
 *
 * No lleva @RequirePermission: cada alerta declara su módulo y privilegio, y el
 * servicio devuelve sólo las que el usuario puede ver.
 */
@ApiTags('Alertas de empresa')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
@Controller({ path: 'alertas-empresa', version: '1' })
export class AlertasEmpresaController {
  constructor(private readonly alertasService: AlertasEmpresaService) {}

  @Get()
  @ApiOperation({ summary: 'Alertas abiertas que le corresponden al usuario' })
  @ApiQuery({ name: 'modulo', required: false })
  @ApiQuery({ name: 'entidad_tipo', required: false })
  listar(
    @GetUser() user: LoginUserInfo,
    @Query('modulo') modulo?: string,
    @Query('entidad_tipo') entidadTipo?: string,
  ) {
    return this.alertasService.listarParaUsuario(user.id, user.empresa_id, {
      modulo: modulo || undefined,
      entidadTipo: entidadTipo || undefined,
    });
  }

  @Patch('popup-mostrada')
  @ApiOperation({ summary: 'Registrar que se le mostraron alertas críticas en el popup' })
  async popupMostrada(@GetUser() user: LoginUserInfo, @Body(ValidationPipe) dto: PopupMostradaDto) {
    await this.alertasService.marcarMostradaPopup(dto.ids, user.id, user.empresa_id);
    return { ok: true };
  }

  @Patch(':id/leida')
  @ApiOperation({ summary: 'Marcar una alerta como leída por el usuario' })
  async marcarLeida(@GetUser() user: LoginUserInfo, @Param('id', ParseUUIDPipe) id: string) {
    await this.alertasService.marcarLeida(id, user.id, user.empresa_id);
    return { ok: true };
  }
}
