import { Body, Controller, Get, HttpCode, Param, Post, Query, Req, UseGuards } from '@nestjs/common';
import type { Request } from 'express';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { GetUser } from 'src/auth/get-user.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { AyudaIaService } from '../services/ayuda-ia.service';
import { CrearSesionDto, FeedbackDto, PreguntarDto } from '../dto/preguntar.dto';
import { buildScreenMap } from '../ingesta/seed-catalogo';

function getIp(req: Request): string | undefined {
  const fwd = req.headers['x-forwarded-for'];
  if (typeof fwd === 'string') return fwd.split(',')[0].trim();
  if (Array.isArray(fwd) && fwd.length) return fwd[0];
  return req.ip ?? req.socket?.remoteAddress ?? undefined;
}

@ApiTags('ayuda-ia')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
@Controller({ path: 'ayuda-ia', version: '1' })
export class AyudaIaController {
  constructor(private readonly service: AyudaIaService) {}

  @Post('sesiones')
  @ApiOperation({ summary: 'Crear nueva sesión de chat' })
  crearSesion(@Body() dto: CrearSesionDto, @GetUser() user: LoginUserInfo) {
    return this.service.crearSesion(user.empresa_id, user.id, dto.titulo);
  }

  @Get('analytics/recall')
  @ApiOperation({
    summary: 'Métricas de calidad del retrieval (huecos en la base de ayuda)',
  })
  getRecallAnalytics(
    @GetUser() user: LoginUserInfo,
    @Query('dias') dias?: string,
  ) {
    const d = Number.parseInt(dias ?? '30', 10);
    return this.service.getRecallAnalytics(user.empresa_id, Number.isFinite(d) && d > 0 ? d : 30);
  }

  @Get('catalogo/screen-map')
  @ApiOperation({
    summary: 'Mapa pathname → screen_key derivado del catálogo (fuente única de verdad)',
  })
  getScreenMap() {
    return buildScreenMap();
  }

  @Get('sesiones')
  @ApiOperation({ summary: 'Listar sesiones del usuario actual' })
  listarSesiones(@GetUser() user: LoginUserInfo) {
    return this.service.listarSesiones(user.empresa_id, user.id);
  }

  @Get('sesiones/:id/mensajes')
  @ApiOperation({ summary: 'Listar mensajes de una sesión' })
  listarMensajes(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.listarMensajes(id, user.empresa_id, user.id);
  }

  // TODO: agregar @Throttle de @nestjs/throttler cuando se instale (límite 30/hora/usuario).
  @Post('sesiones/:id/preguntar')
  @HttpCode(200)
  @ApiOperation({ summary: 'Hacer una pregunta en una sesión (RAG)' })
  preguntar(
    @Param('id') id: string,
    @Body() dto: PreguntarDto,
    @GetUser() user: LoginUserInfo,
    @Req() req: Request,
  ) {
    return this.service.preguntar({
      sesionId: id,
      empresaId: user.empresa_id,
      usuarioId: user.id,
      pregunta: dto.pregunta,
      screen_key: dto.screen_key,
      screen_url: dto.screen_url,
      screen_modulo: dto.screen_modulo,
      screen_submodulo: dto.screen_submodulo,
      ip_address: getIp(req),
      user_agent: req.headers['user-agent'],
    });
  }

  @Post('mensajes/:id/feedback')
  @HttpCode(200)
  @ApiOperation({ summary: 'Calificar una respuesta del asistente (up/down)' })
  feedback(
    @Param('id') id: string,
    @Body() dto: FeedbackDto,
    @GetUser() user: LoginUserInfo,
    @Req() req: Request,
  ) {
    return this.service.feedback(id, user.empresa_id, dto.feedback, {
      user_id: user.id,
      ip_address: getIp(req),
      user_agent: req.headers['user-agent'],
    });
  }
}
