import {
  Body,
  Controller,
  Delete,
  Get,
  Ip,
  Param,
  Post,
  Req,
  UseGuards,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import type { Request } from 'express';
import { GetUser } from 'src/auth/get-user.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { RequireSubmodulo } from 'src/auth/decorators';
import { SubmoduloGuard } from 'src/auth/guards';
import { ChatService } from './chat.service';
import { EnviarMensajeDto, GuardarFavoritoDto } from './dto/chat.dto';

@ApiTags('ai-chat')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('REP_DASHBOARD_IA')
@Controller({ path: 'ai-chat', version: '1' })
export class ChatController {
  constructor(private readonly chatService: ChatService) {}

  // ── Sesiones ──────────────────────────────────────────────────

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

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

  @Get('sesiones/:id')
  @ApiOperation({ summary: 'Obtener sesión con todos sus mensajes' })
  getSesion(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.chatService.getSesionConMensajes(id, user.empresa_id, user.id);
  }

  // ── Mensajes ──────────────────────────────────────────────────

  @Post('sesiones/:id/mensajes')
  @ApiOperation({ summary: 'Enviar pregunta en lenguaje natural — devuelve datos + gráfico' })
  enviarMensaje(
    @Param('id') sesionId: string,
    @Body() dto: EnviarMensajeDto,
    @GetUser() user: LoginUserInfo,
    @Ip() ip: string,
    @Req() req: Request,
  ) {
    const userAgent = req.headers['user-agent'] ?? undefined;
    return this.chatService.enviarMensaje(sesionId, user.empresa_id, user.id, dto.pregunta, { ip, userAgent });
  }

  // ── Favoritos ─────────────────────────────────────────────────

  @Post('favoritos')
  @ApiOperation({ summary: 'Guardar mensaje de IA como favorito (el SQL se obtiene internamente)' })
  guardarFavorito(@Body() dto: GuardarFavoritoDto, @GetUser() user: LoginUserInfo) {
    return this.chatService.guardarFavorito(user.empresa_id, user.id, dto.mensaje_id, dto.titulo);
  }

  @Get('favoritos')
  @ApiOperation({ summary: 'Listar favoritos del usuario' })
  listarFavoritos(@GetUser() user: LoginUserInfo) {
    return this.chatService.listarFavoritos(user.empresa_id, user.id);
  }

  @Delete('favoritos/:id')
  @ApiOperation({ summary: 'Eliminar favorito' })
  eliminarFavorito(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.chatService.eliminarFavorito(id, user.empresa_id, user.id);
  }

  @Post('favoritos/:id/ejecutar')
  @ApiOperation({ summary: 'Re-ejecutar un favorito guardado' })
  ejecutarFavorito(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.chatService.ejecutarFavorito(id, user.empresa_id, user.id);
  }
}
