import { Body, Controller, Get, Param, Patch, Post, 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 {
  AprobarMasivoDto,
  ImportarComisionesDto,
  QueryComisionesPendientesDto,
  RechazarComisionDto,
  VincularEmpleadoDto,
} from './dto/comisiones.dto';
import { RrhhComisionesService } from './rrhh-comisiones.service';

@ApiTags('RRHH - Comisiones')
@Controller({ path: 'rrhh/comisiones', version: '1' })
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('RRHH')
@ApiBearerAuth()
export class RrhhComisionesController {
  constructor(private readonly service: RrhhComisionesService) {}

  @Post('importar')
  @RequirePermission('RRHH', 'RH_COM_COMISION_IMPORTAR')
  @ApiOperation({ summary: 'Importar comisiones del módulo comercial al pool RRHH del período' })
  importar(@GetUser() user: LoginUserInfo, @Body() dto: ImportarComisionesDto) {
    return this.service.importarDesdeModuloComercial(user.empresa_id, dto.periodo_anio, dto.periodo_mes, user.id);
  }

  @Get('pendientes')
  @RequirePermission('RRHH', 'RH_COM_COMISION_VER')
  @ApiOperation({ summary: 'Listar comisiones del pool por período' })
  pendientes(@GetUser() user: LoginUserInfo, @Query() query: QueryComisionesPendientesDto) {
    return this.service.listarPendientesPorPeriodo(user.empresa_id, query.periodo_anio, query.periodo_mes, {
      estado: query.estado,
      empleadoId: query.empleado_id,
    });
  }

  @Patch(':id/aprobar')
  @RequirePermission('RRHH', 'RH_COM_COMISION_REVISAR')
  @ApiOperation({ summary: 'Aprobar una comisión' })
  aprobar(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.aprobar(id, user.empresa_id, user.id);
  }

  @Patch(':id/rechazar')
  @RequirePermission('RRHH', 'RH_COM_COMISION_REVISAR')
  @ApiOperation({ summary: 'Rechazar una comisión (motivo obligatorio)' })
  rechazar(@Param('id') id: string, @GetUser() user: LoginUserInfo, @Body() dto: RechazarComisionDto) {
    return this.service.rechazar(id, user.empresa_id, dto.motivo, user.id);
  }

  @Post('aprobar-masivo')
  @RequirePermission('RRHH', 'RH_COM_COMISION_REVISAR')
  @ApiOperation({ summary: 'Aprobar varias comisiones por id' })
  aprobarMasivo(@GetUser() user: LoginUserInfo, @Body() dto: AprobarMasivoDto) {
    return this.service.aprobarMasivo(dto.ids, user.empresa_id, user.id);
  }

  @Get('vinculaciones')
  @RequirePermission('RRHH', 'RH_COM_COMISION_VER')
  @ApiOperation({ summary: 'Listar supervisores/vendedores y su empleado RRHH vinculado' })
  vinculaciones(@GetUser() user: LoginUserInfo) {
    return this.service.listarVinculaciones(user.empresa_id);
  }

  @Patch('vinculaciones/:tipo/:id')
  @RequirePermission('RRHH', 'RH_COM_COMISION_REVISAR')
  @ApiOperation({ summary: 'Vincular/desvincular un supervisor o vendedor con un empleado RRHH' })
  vincular(
    @Param('tipo') tipo: string,
    @Param('id') id: string,
    @GetUser() user: LoginUserInfo,
    @Body() dto: VincularEmpleadoDto,
  ) {
    return this.service.vincularEmpleado(user.empresa_id, tipo, id, dto.empleado_id ?? null);
  }
}
