import { Body, Controller, Get, HttpCode, Post, UseGuards } from '@nestjs/common';
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 { RequireSubmodulo } from 'src/auth/decorators';
import { SubmoduloGuard } from 'src/auth/guards';
import { AiConfigService } from './ai-config.service';
import { AiUsageService } from 'src/ai-usage/ai-usage.service';
import { UpsertAiConfigDto } from './dto/upsert-ai-config.dto';

@ApiTags('ai-config')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('REP_DASHBOARD_IA')
@Controller({ path: 'ai-config', version: '1' })
export class AiConfigController {
  constructor(
    private readonly aiConfigService: AiConfigService,
    private readonly aiUsage: AiUsageService,
  ) {}

  @Post()
  @ApiOperation({ summary: 'Crear o actualizar configuración IA de la empresa' })
  upsert(@Body() dto: UpsertAiConfigDto, @GetUser() user: LoginUserInfo) {
    return this.aiConfigService.upsertConfig(user.empresa_id, dto);
  }

  @Get()
  @ApiOperation({ summary: 'Obtener configuración IA de la empresa' })
  getConfig(@GetUser() user: LoginUserInfo) {
    return this.aiConfigService.getConfig(user.empresa_id);
  }

  @Post('modelos')
  @HttpCode(200)
  @ApiOperation({ summary: 'Listar modelos disponibles para el proveedor/API key dado' })
  listarModelos(@Body() body: { proveedor: string; api_key?: string }, @GetUser() user: LoginUserInfo) {
    return this.aiConfigService.listarModelos(user.empresa_id, body);
  }

  @Post('test')
  @HttpCode(200)
  @ApiOperation({ summary: 'Probar conexión con el proveedor IA configurado' })
  testConexion(@Body() body: { proveedor?: string; modelo?: string; api_key?: string }, @GetUser() user: LoginUserInfo) {
    return this.aiConfigService.testConexion(user.empresa_id, body);
  }

  @Get('consumo')
  @ApiOperation({ summary: 'Métricas de consumo IA: tokens, consultas, éxito, timeline' })
  getConsumo(@GetUser() user: LoginUserInfo) {
    return this.aiConfigService.getConsumo(user.empresa_id);
  }

  @Get('tokens/estado')
  @ApiOperation({ summary: 'Estado del tope mensual de tokens: límite, consumido, restante y desglose por feature' })
  estadoTokens(@GetUser() user: LoginUserInfo) {
    return this.aiUsage.estadoConsumo(user.empresa_id);
  }
}
