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 {
  CambiarEstadoPermisoPresentismoDto,
  CreatePermisoPresentismoDto,
  QueryPermisosPresentismoDto,
  UpdatePermisoPresentismoDto,
} from '../dto/presentismo-fase3.dto';
import { PermisosPresentismoService } from '../services/permisos-presentismo.service';

@ApiTags('RRHH - Presentismo - Permisos')
@Controller({ path: 'rrhh/presentismo', version: '1' })
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('RRHH')
@ApiBearerAuth()
export class PermisosPresentismoController {
  constructor(private readonly service: PermisosPresentismoService) {}

  @Get('permisos')
  @RequirePermission('RRHH', 'RH_PER_PERMISO_VER')
  @ApiOperation({ summary: 'Listar permisos de presentismo' })
  listar(@GetUser() user: LoginUserInfo, @Query() query: QueryPermisosPresentismoDto) {
    return this.service.listar(user.empresa_id, query);
  }

  @Get('permisos/:id')
  @RequirePermission('RRHH', 'RH_PER_PERMISO_VER')
  @ApiOperation({ summary: 'Obtener permiso de presentismo' })
  obtener(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.obtener(id, user.empresa_id);
  }

  @Post('permisos')
  @RequirePermission('RRHH', 'RH_PER_PERMISO_CREAR')
  @ApiOperation({ summary: 'Crear permiso de presentismo (estado inicial: PENDIENTE)' })
  crear(@GetUser() user: LoginUserInfo, @Body() dto: CreatePermisoPresentismoDto) {
    return this.service.crear(user.empresa_id, dto, user.id);
  }

  @Patch('permisos/:id')
  @RequirePermission('RRHH', 'RH_PER_PERMISO_EDITAR')
  @ApiOperation({ summary: 'Editar permiso de presentismo (solo estado PENDIENTE)' })
  actualizar(
    @Param('id') id: string,
    @GetUser() user: LoginUserInfo,
    @Body() dto: UpdatePermisoPresentismoDto,
  ) {
    return this.service.actualizar(id, user.empresa_id, dto);
  }

  @Patch('permisos/:id/aprobar')
  @RequirePermission('RRHH', 'RH_PER_PERMISO_APROBAR')
  @ApiOperation({ summary: 'Aprobar permiso de presentismo' })
  aprobar(
    @Param('id') id: string,
    @GetUser() user: LoginUserInfo,
    @Body() dto: CambiarEstadoPermisoPresentismoDto,
  ) {
    return this.service.aprobar(id, user.empresa_id, user.id, dto);
  }

  @Patch('permisos/:id/rechazar')
  @RequirePermission('RRHH', 'RH_PER_PERMISO_APROBAR')
  @ApiOperation({ summary: 'Rechazar permiso de presentismo' })
  rechazar(
    @Param('id') id: string,
    @GetUser() user: LoginUserInfo,
    @Body() dto: CambiarEstadoPermisoPresentismoDto,
  ) {
    return this.service.rechazar(id, user.empresa_id, user.id, dto);
  }
}
