import { Body, Controller, Get, Param, ParseUUIDPipe, Patch, Post, 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 {
  CambiarExclusionDto,
  UpdateConsumoFuncionarioConfigDto,
  VincularFichasDto,
} from '../dto/consumo-funcionario.dto';
import { ConsumoFuncionarioConfigService } from '../services/consumo-funcionario-config.service';

// Usa los permisos de Parámetros: es configuración del módulo, y así no hace
// falta tocar el catálogo de seguridad ni reasignar perfiles.
@ApiTags('RRHH - Consumo de funcionarios')
@Controller({ path: 'rrhh/consumo-funcionario', version: '1' })
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('RRHH')
@ApiBearerAuth()
export class ConsumoFuncionarioController {
  constructor(private readonly service: ConsumoFuncionarioConfigService) {}

  @Get('config')
  @RequirePermission('RRHH', 'RH_CFG_PARAMETRO_VER')
  @ApiOperation({ summary: 'Configuración del consumo de funcionarios y estado de sus requisitos' })
  obtener(@GetUser() user: LoginUserInfo) {
    return this.service.obtener(user.empresa_id);
  }

  @Patch('config')
  @RequirePermission('RRHH', 'RH_CFG_PARAMETRO_EDITAR')
  @ApiOperation({ summary: 'Actualizar la configuración. Al activarlo crea el concepto si falta' })
  actualizar(@GetUser() user: LoginUserInfo, @Body() dto: UpdateConsumoFuncionarioConfigDto) {
    return this.service.actualizar(user.empresa_id, dto, user.id);
  }

  @Post('vincular-fichas')
  @RequirePermission('RRHH', 'RH_CFG_PARAMETRO_EDITAR')
  @ApiOperation({ summary: 'Vincular a los funcionarios activos con su ficha de cliente' })
  vincularFichas(@GetUser() user: LoginUserInfo, @Body() dto: VincularFichasDto) {
    return this.service.vincularFichas(user.empresa_id, dto.crear ?? false, user.id);
  }

  @Get('facturas-excluidas')
  @RequirePermission('RRHH', 'RH_CFG_PARAMETRO_VER')
  @ApiOperation({ summary: 'Facturas de funcionarios que no se proponen como descuento por planilla' })
  facturasExcluidas(@GetUser() user: LoginUserInfo) {
    return this.service.facturasExcluidas(user.empresa_id);
  }

  @Patch('facturas/:cuentaCobrarId/exclusion')
  @RequirePermission('RRHH', 'RH_CFG_PARAMETRO_EDITAR')
  @ApiOperation({ summary: 'Excluir o volver a incluir una factura del descuento por planilla' })
  cambiarExclusion(
    @Param('cuentaCobrarId', ParseUUIDPipe) cuentaCobrarId: string,
    @Body() dto: CambiarExclusionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.cambiarExclusion(user.empresa_id, cuentaCobrarId, dto.excluir, user.id);
  }
}
