import { Body, Controller, Get, Param, Post, Put, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { RequireModule } from '../../auth/decorators/require-module.decorator';
import { RequirePermission } from '../../auth/decorators/require-permission.decorator';
import type { LoginUserInfo } from '../../auth/dto/login.dto';
import { GetUser } from '../../auth/get-user.decorator';
import { ModuleGuard } from '../../auth/guards/module.guard';
import { PermissionGuard } from '../../auth/guards/permission.guard';
import { ProcesarNovedadesPresentismoDto, AnularNovedadPresentismoDto } from '../dto/presentismo-fase4.dto';
import { QueryNovedadesDto } from '../dto/novedades.dto';
import { PresentismoEngineService } from '../engine/presentismo-engine.service';
import { NovedadesService } from '../services/novedades.service';

@ApiTags('RRHH - Presentismo - Novedades')
@Controller({ path: 'rrhh/presentismo/novedades', version: '1' })
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('RRHH')
@ApiBearerAuth()
export class PresentismoNovedadesController {
  constructor(
    private readonly engine: PresentismoEngineService,
    private readonly novedades: NovedadesService,
  ) {}

  @Get()
  @RequirePermission('RRHH', 'RH_MAR_MARCACION_VER')
  @ApiOperation({ summary: 'Listar novedades de presentismo (incluye estado y trazabilidad)' })
  listar(@GetUser() user: LoginUserInfo, @Query() query: QueryNovedadesDto) {
    return this.novedades.listar(user.empresa_id, query);
  }

  @Post('procesar')
  @RequirePermission('RRHH', 'RH_NOV_NOVEDAD_CREAR')
  @ApiOperation({
    summary: 'Procesar novedades de presentismo para un período',
    description:
      'Idempotente: anula novedades automáticas previas del período y genera el nuevo set.',
  })
  procesar(@GetUser() user: LoginUserInfo, @Body() dto: ProcesarNovedadesPresentismoDto) {
    return this.engine.procesarPeriodo(user.empresa_id, {
      fechaDesde: dto.fecha_desde,
      fechaHasta: dto.fecha_hasta,
      sucursalId: dto.sucursal_id,
      userId: user.id,
    });
  }

  @Put(':id/anular')
  @RequirePermission('RRHH', 'RH_NOV_NOVEDAD_ELIMINAR')
  @ApiOperation({ summary: 'Anular novedad (bloquea si ya está linkeada a liquidación cerrada)' })
  anular(
    @Param('id') id: string,
    @GetUser() user: LoginUserInfo,
    @Body() dto: AnularNovedadPresentismoDto,
  ) {
    return this.novedades.anularPresentismo(id, user.empresa_id, user.id, dto.motivo);
  }
}
