import { Body, Controller, Get, Param, ParseUUIDPipe, Post, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { RequireModule, RequirePermission } from 'src/auth/decorators';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { ModuleGuard, PermissionGuard } from 'src/auth/guards';
import { BusquedasService } from './busquedas.service';
import { AprobarMasivoDto } from './dto/aprobar-masivo.dto';
import { CrearBusquedaDto } from './dto/crear-busqueda.dto';
import { ListarSugerenciasDto } from './dto/listar-sugerencias.dto';
import { SugerenciasService } from './sugerencias.service';

@ApiTags('Imágenes IA')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('INVENTARIO')
@Controller({ path: 'imagenes-ia', version: '1' })
export class ImagenesIaController {
  constructor(
    private readonly busquedas: BusquedasService,
    private readonly sugerencias: SugerenciasService,
  ) {}

  @Get('estado')
  @RequirePermission('INVENTARIO', 'INV_IMG_SUGERENCIA_VER')
  @ApiOperation({ summary: 'Prerrequisitos y búsqueda activa' })
  estado(@GetUser() user: LoginUserInfo) {
    return this.busquedas.estado(user.empresa_id);
  }

  @Post('busquedas/estimar')
  @RequirePermission('INVENTARIO', 'INV_IMG_BUSQUEDA_CREAR')
  @ApiOperation({ summary: 'Estimar productos, consultas y costo sin encolar' })
  estimar(@Body() dto: CrearBusquedaDto, @GetUser() user: LoginUserInfo) {
    return this.busquedas.estimar(user.empresa_id, dto);
  }

  @Post('busquedas')
  @RequirePermission('INVENTARIO', 'INV_IMG_BUSQUEDA_CREAR')
  @ApiOperation({ summary: 'Crear y encolar una búsqueda de imágenes' })
  crear(@Body() dto: CrearBusquedaDto, @GetUser() user: LoginUserInfo) {
    return this.busquedas.crear(user.empresa_id, user.id, dto);
  }

  @Get('busquedas')
  @RequirePermission('INVENTARIO', 'INV_IMG_SUGERENCIA_VER')
  listar(@GetUser() user: LoginUserInfo, @Query('page') page?: string, @Query('limit') limit?: string) {
    return this.busquedas.listar(user.empresa_id, Number(page) || 1, Math.min(50, Number(limit) || 10));
  }

  @Get('busquedas/:id')
  @RequirePermission('INVENTARIO', 'INV_IMG_SUGERENCIA_VER')
  obtener(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.busquedas.obtener(user.empresa_id, id);
  }

  @Post('busquedas/:id/cancelar')
  @RequirePermission('INVENTARIO', 'INV_IMG_BUSQUEDA_CREAR')
  cancelar(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.busquedas.cancelar(user.empresa_id, id);
  }

  @Get('sugerencias')
  @RequirePermission('INVENTARIO', 'INV_IMG_SUGERENCIA_VER')
  @ApiOperation({ summary: 'Sugerencias agrupadas por producto' })
  listarSugerencias(@Query() dto: ListarSugerenciasDto, @GetUser() user: LoginUserInfo) {
    return this.sugerencias.listar(user.empresa_id, dto);
  }

  // Las rutas con literal van antes de `:id/...` para que Nest no confunda el literal con un UUID.
  @Post('sugerencias/aprobar-masivo')
  @RequirePermission('INVENTARIO', 'INV_IMG_SUGERENCIA_APROBAR')
  aprobarMasivo(@Body() dto: AprobarMasivoDto, @GetUser() user: LoginUserInfo) {
    return this.sugerencias.aprobarMasivo(user.empresa_id, user.id, dto);
  }

  @Post('sugerencias/producto/:productoId/rechazar-restantes')
  @RequirePermission('INVENTARIO', 'INV_IMG_SUGERENCIA_APROBAR')
  rechazarRestantes(@Param('productoId', ParseUUIDPipe) productoId: string, @GetUser() user: LoginUserInfo) {
    return this.sugerencias.rechazarRestantes(user.empresa_id, user.id, productoId);
  }

  @Post('sugerencias/:id/aprobar')
  @RequirePermission('INVENTARIO', 'INV_IMG_SUGERENCIA_APROBAR')
  aprobar(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.sugerencias.aprobar(user.empresa_id, user.id, id);
  }

  @Post('sugerencias/:id/rechazar')
  @RequirePermission('INVENTARIO', 'INV_IMG_SUGERENCIA_APROBAR')
  rechazar(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.sugerencias.rechazar(user.empresa_id, user.id, id);
  }
}
