import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsBoolean, IsIn, IsNumber, IsOptional, IsString, Max, MaxLength, Min } from 'class-validator';

export class UpsertAyudaConfigDto {
  @ApiProperty({ enum: ['anthropic', 'openai', 'deepseek', 'ollama'] })
  @IsIn(['anthropic', 'openai', 'deepseek', 'ollama'])
  proveedor!: string;

  @ApiProperty()
  @IsString()
  @MaxLength(100)
  modelo!: string;

  @ApiPropertyOptional({ enum: ['anthropic', 'openai', 'ollama'] })
  @IsOptional()
  @IsIn(['anthropic', 'openai', 'ollama'])
  proveedor_embeddings?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  @MaxLength(100)
  modelo_embeddings?: string;

  @ApiPropertyOptional({ description: 'Solo para ollama o endpoints custom' })
  @IsOptional()
  @IsString()
  @MaxLength(255)
  base_url?: string;

  @ApiPropertyOptional({ description: 'Si se envía vacía, no se modifica la guardada' })
  @IsOptional()
  @IsString()
  api_key?: string;

  @ApiPropertyOptional({ description: 'API key separada para el proveedor de embeddings (opcional)' })
  @IsOptional()
  @IsString()
  api_key_embeddings?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsBoolean()
  activo?: boolean;

  @ApiPropertyOptional({ minimum: 100, maximum: 4096, default: 800 })
  @IsOptional()
  @IsNumber()
  @Min(100)
  @Max(4096)
  max_tokens?: number;

  @ApiPropertyOptional({ minimum: 0, maximum: 2, default: 0.2 })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Max(2)
  temperatura?: number;

  // ── Re-ranker (v1.1) ─────────────────────────────────────────────
  @ApiPropertyOptional({
    enum: ['cohere', 'jina', 'local'],
    description: 'Proveedor del cross-encoder. Mejora la precisión del retriever.',
  })
  @IsOptional()
  @IsIn(['cohere', 'jina', 'local'])
  reranker_proveedor?: string;

  @ApiPropertyOptional({
    example: 'rerank-multilingual-v3.0',
    description: 'Modelo del reranker. Ej: rerank-multilingual-v3.0 (Cohere)',
  })
  @IsOptional()
  @IsString()
  @MaxLength(100)
  reranker_modelo?: string;

  @ApiPropertyOptional({ description: 'API key del reranker. Vacía no modifica la guardada.' })
  @IsOptional()
  @IsString()
  reranker_api_key?: string;

  @ApiPropertyOptional({ description: 'Solo para reranker local (Ollama / endpoint custom)' })
  @IsOptional()
  @IsString()
  @MaxLength(255)
  reranker_base_url?: string;

  @ApiPropertyOptional({
    minimum: 1,
    maximum: 20,
    default: 5,
    description: 'Cantidad de chunks que pasan al LLM tras el re-ranking.',
  })
  @IsOptional()
  @IsNumber()
  @Min(1)
  @Max(20)
  reranker_top_k?: number;

  @ApiPropertyOptional({
    minimum: 0,
    maximum: 1,
    default: 0.30,
    description: 'Umbral mínimo de score (0-1). Chunks por debajo se descartan.',
  })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Max(1)
  reranker_min_score?: number;

  @ApiPropertyOptional({ default: false })
  @IsOptional()
  @IsBoolean()
  reranker_activo?: boolean;
}
