import { Body, Controller, Get, Post, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import { GetUser } from 'src/auth/get-user.decorator';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { ProbarMapeoDto, VistaPreviaMapeoDto } from 'src/contabilidad/dto/regla-mapeo.dto';
import { VistaPreviaMapeoService } from './vista-previa-mapeo.service';

/**
 * Vista previa del mapeo con documentos reales (spec 2026-10-13 §6.2). Vive en
 * este módulo, bajo la misma ruta que Mapeo de cuentas, porque usa la simulación
 * de Rehacer asientos (RecontabilizacionService): ContabilidadModule no puede
 * depender de Conciliación sin un ciclo.
 */
@ApiTags('Contabilidad - Mapeo de Cuentas')
@Controller({ path: 'contabilidad/mapeo-cuentas', version: '1' })
@UseGuards(AuthGuard('jwt'), PermissionGuard)
@ApiBearerAuth()
export class VistaPreviaMapeoController {
  constructor(private readonly service: VistaPreviaMapeoService) {}

  @Post('vista-previa')
  @RequirePermission('CONTABILIDAD', 'CONT_MAP_MAPEO_VER')
  @ApiOperation({ summary: 'Asiento vigente de un documento al lado del que saldría hoy, con la traza de cada línea (no escribe)' })
  vistaPrevia(@GetUser() user: LoginUserInfo, @Body() dto: VistaPreviaMapeoDto) {
    return this.service.vistaPrevia(user.empresa_id, dto);
  }

  @Post('probar')
  @RequirePermission('CONTABILIDAD', 'CONT_MAP_MAPEO_VER')
  @ApiOperation({ summary: 'Probar el mapeo contra los últimos N documentos de un tipo (máx. 100, no escribe)' })
  probar(@GetUser() user: LoginUserInfo, @Body() dto: ProbarMapeoDto) {
    return this.service.probar(user.empresa_id, dto);
  }

  @Get('origenes-simulables')
  @RequirePermission('CONTABILIDAD', 'CONT_MAP_MAPEO_VER')
  @ApiOperation({ summary: 'Tipos de documento que se pueden previsualizar con el mapeo (registro activo, con integrador)' })
  origenesSimulables() {
    return this.service.origenesSimulables();
  }

  @Get('documentos')
  @RequirePermission('CONTABILIDAD', 'CONT_MAP_MAPEO_VER')
  @ApiOperation({ summary: 'Buscar documentos de un tipo por número (hasta 20), para la vista previa' })
  documentos(@GetUser() user: LoginUserInfo, @Query('origenTipo') origenTipo: string, @Query('q') q?: string) {
    return this.service.buscarDocumentos(user.empresa_id, origenTipo, q);
  }
}
