import { Controller, Get, Query, Res, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import type { Response } from 'express';
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 { ExportarLegajosConsultaDto, QueryLegajosConsultaDto } from '../dto/legajos.dto';
import { LegajosConsultaService } from '../services/legajos-consulta.service';

@ApiTags('RRHH - Legajos - Consulta avanzada (M26)')
@Controller({ path: 'rrhh/legajos', version: '1' })
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('RRHH')
@ApiBearerAuth()
export class LegajosConsultaController {
  constructor(private readonly consulta: LegajosConsultaService) {}

  @Get('consulta')
  @RequirePermission('RRHH', 'RH_LEG_LEGAJO_VER')
  @ApiOperation({
    summary: 'Consulta avanzada de documentos de legajo con filtros combinados y paginación cursor-based',
  })
  consultar(@GetUser() user: LoginUserInfo, @Query() query: QueryLegajosConsultaDto) {
    return this.consulta.consultar(user.empresa_id, query);
  }

  @Get('consulta/exportar')
  @RequirePermission('RRHH', 'RH_LEG_LEGAJO_VER')
  @ApiOperation({
    summary: 'Exportar consulta avanzada a Excel (xlsx)',
  })
  async exportar(
    @GetUser() user: LoginUserInfo,
    @Query() query: ExportarLegajosConsultaDto,
    @Res() res: Response,
  ) {
    const out = await this.consulta.exportarExcel(user.empresa_id, query);

    res.setHeader(
      'Content-Type',
      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    );
    res.setHeader('Content-Disposition', `attachment; filename="${out.filename}"`);
    res.send(out.buffer);
  }
}
