import {
  Body,
  Controller,
  Get,
  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 {
  DashboardFiltros,
  LegajosDashboardService,
} from '../services/legajos-dashboard.service';
import { LegajosVencimientoSchedulerService } from '../services/legajos-vencimiento-scheduler.service';

interface EjecutarJobBody {
  /** Empresa específica a procesar (por defecto, todas). */
  empresa_id?: string;
  /** Si true, ejecuta en línea sin pasar por la cola (útil para tests). */
  inline?: boolean;
}

@ApiTags('RRHH - Legajos - Dashboard (M25, M26)')
@Controller({ path: 'rrhh/legajos', version: '1' })
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('RRHH')
@ApiBearerAuth()
export class LegajosDashboardController {
  constructor(
    private readonly dashboard: LegajosDashboardService,
    private readonly scheduler: LegajosVencimientoSchedulerService,
  ) {}

  @Get('dashboard/vencimientos')
  @RequirePermission('RRHH', 'RH_LEG_LEGAJO_VER')
  @ApiOperation({
    summary: 'Documentos VENCIDOS y POR_VENCER del legajo (panel resumen)',
  })
  vencimientos(@GetUser() user: LoginUserInfo, @Query() filtros: DashboardFiltros) {
    return this.dashboard.vencimientos(user.empresa_id, filtros);
  }

  @Get('dashboard/legajos-incompletos')
  @RequirePermission('RRHH', 'RH_LEG_LEGAJO_VER')
  @ApiOperation({
    summary: 'Funcionarios activos con documentos obligatorios faltantes o vencidos',
  })
  legajosIncompletos(@GetUser() user: LoginUserInfo, @Query() filtros: DashboardFiltros) {
    return this.dashboard.legajosIncompletos(user.empresa_id, filtros);
  }

  @Post('jobs/actualizar-estados-vencimiento')
  @RequirePermission('RRHH', 'RH_CFG_PARAMETRO_EDITAR')
  @ApiOperation({
    summary: 'Ejecutar manualmente el job de actualización de estados de vencimiento',
    description:
      'Encola una corrida única del job (el repeatable diario sigue activo). Por defecto, sólo procesa ' +
      'la empresa del usuario; el SUPER_ADMIN puede pasar empresa_id distinto.',
  })
  async ejecutarJob(
    @GetUser() user: LoginUserInfo,
    @Body() body: EjecutarJobBody = {},
  ) {
    const empresaId = body.empresa_id || user.empresa_id;
    await this.scheduler.runOnce(empresaId);
    return {
      encolado: true,
      empresa_id: empresaId,
      mensaje:
        'Job de actualización de estados encolado. Los resultados se reflejarán en pocos segundos.',
    };
  }
}
