import { Body, Controller, Delete, 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 {
  AccionSolicitudDto,
  CreateSolicitudVacacionesDto,
  QuerySaldosDto,
  QuerySolicitudesDto,
  RecalcularSaldosDto,
  UpdateSolicitudVacacionesDto,
} from '../dto/vacaciones.dto';
import { VacacionesService } from '../services/vacaciones.service';

@ApiTags('RRHH - Vacaciones')
@Controller({ path: 'rrhh/vacaciones', version: '1' })
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('RRHH')
@ApiBearerAuth()
export class VacacionesController {
  constructor(private readonly service: VacacionesService) {}

  // ── Saldos ─────────────────────────────────────────────
  @Get('saldos')
  @RequirePermission('RRHH', 'RH_VAC_VACACION_VER')
  @ApiOperation({ summary: 'Listar saldos de vacaciones por empleado' })
  listarSaldos(@GetUser() user: LoginUserInfo, @Query() query: QuerySaldosDto) {
    return this.service.listarSaldos(user.empresa_id, query);
  }

  @Post('saldos/recalcular')
  @RequirePermission('RRHH', 'RH_VAC_VACACION_CREAR')
  @ApiOperation({
    summary: 'Recalcular saldos según escala legal de antigüedad',
    description:
      'Aplica Art. 219 CT (Paraguay): <5 años=12 días, 5-10 años=18 días, >10 años=30 días. ' +
      'Resta días tomados (solicitudes APROBADAS de tipo VACACION). No toca saldos cerrados.',
  })
  recalcularSaldos(@GetUser() user: LoginUserInfo, @Body() dto: RecalcularSaldosDto) {
    return this.service.recalcularSaldos(user.empresa_id, dto);
  }

  // ── Solicitudes ───────────────────────────────────────
  @Get('solicitudes')
  @RequirePermission('RRHH', 'RH_VAC_VACACION_VER')
  @ApiOperation({ summary: 'Listar solicitudes de vacaciones/permisos/licencias' })
  listarSolicitudes(@GetUser() user: LoginUserInfo, @Query() query: QuerySolicitudesDto) {
    return this.service.listarSolicitudes(user.empresa_id, query);
  }

  @Post('solicitudes')
  @RequirePermission('RRHH', 'RH_VAC_VACACION_CREAR')
  @ApiOperation({ summary: 'Crear solicitud (estado SOLICITADO)' })
  crearSolicitud(
    @GetUser() user: LoginUserInfo,
    @Body() dto: CreateSolicitudVacacionesDto,
  ) {
    return this.service.crearSolicitud(user.empresa_id, dto, user.id);
  }

  @Patch('solicitudes/:id')
  @RequirePermission('RRHH', 'RH_VAC_VACACION_EDITAR')
  @ApiOperation({ summary: 'Editar solicitud (sólo si está SOLICITADO)' })
  actualizarSolicitud(
    @Param('id') id: string,
    @GetUser() user: LoginUserInfo,
    @Body() dto: UpdateSolicitudVacacionesDto,
  ) {
    return this.service.actualizarSolicitud(id, user.empresa_id, dto);
  }

  @Patch('solicitudes/:id/aprobar')
  @RequirePermission('RRHH', 'RH_VAC_VACACION_APROBAR')
  @ApiOperation({ summary: 'Aprobar solicitud' })
  aprobar(
    @Param('id') id: string,
    @GetUser() user: LoginUserInfo,
    @Body() dto: AccionSolicitudDto,
  ) {
    return this.service.aprobar(id, user.empresa_id, dto, user.id);
  }

  @Patch('solicitudes/:id/rechazar')
  @RequirePermission('RRHH', 'RH_VAC_VACACION_APROBAR')
  @ApiOperation({ summary: 'Rechazar solicitud' })
  rechazar(
    @Param('id') id: string,
    @GetUser() user: LoginUserInfo,
    @Body() dto: AccionSolicitudDto,
  ) {
    return this.service.rechazar(id, user.empresa_id, dto, user.id);
  }

  @Patch('solicitudes/:id/cancelar')
  @RequirePermission('RRHH', 'RH_VAC_VACACION_EDITAR')
  @ApiOperation({ summary: 'Cancelar solicitud (SOLICITADO o APROBADO)' })
  cancelar(
    @Param('id') id: string,
    @GetUser() user: LoginUserInfo,
    @Body() dto: AccionSolicitudDto,
  ) {
    return this.service.cancelar(id, user.empresa_id, dto, user.id);
  }

  @Delete('solicitudes/:id')
  @RequirePermission('RRHH', 'RH_VAC_VACACION_ELIMINAR')
  @ApiOperation({ summary: 'Eliminar solicitud SOLICITADO' })
  eliminar(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.eliminar(id, user.empresa_id);
  }
}
