import { RefreshCw, Sparkles, X } from 'lucide-react' import { useState } from 'react' import type { NewSubjectWizardState } from '@/features/asignaturas/nueva/types' import type { Dispatch, SetStateAction } from 'react' import { Button } from '@/components/ui/button' import { Checkbox } from '@/components/ui/checkbox' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/tooltip' import { generate_subject_suggestions, usePlan } from '@/data' import { AIProgressLoader } from '@/features/asignaturas/nueva/AIProgressLoader' import { cn } from '@/lib/utils' export default function PasoSugerenciasForm({ wizard, onChange, }: { wizard: NewSubjectWizardState onChange: Dispatch> }) { const enfoque = wizard.iaMultiple?.enfoque ?? '' const cantidadDeSugerencias = wizard.iaMultiple?.cantidadDeSugerencias ?? 5 const isLoading = wizard.iaMultiple?.isLoading ?? false const [showConservacionTooltip, setShowConservacionTooltip] = useState(false) const setIaMultiple = ( patch: Partial>, ) => onChange( (w): NewSubjectWizardState => ({ ...w, iaMultiple: { enfoque: w.iaMultiple?.enfoque ?? '', cantidadDeSugerencias: w.iaMultiple?.cantidadDeSugerencias ?? 10, isLoading: w.iaMultiple?.isLoading ?? false, ...patch, }, }), ) const { data: plan } = usePlan(wizard.plan_estudio_id) const toggleAsignatura = (id: string, checked: boolean) => { onChange((w) => ({ ...w, sugerencias: w.sugerencias.map((s) => s.id === id ? { ...s, selected: checked } : s, ), })) } const onGenerarSugerencias = async () => { const hadNoSugerenciasBefore = wizard.sugerencias.length === 0 const sugerenciasConservadas = wizard.sugerencias.filter((s) => s.selected) onChange((w) => ({ ...w, errorMessage: null, sugerencias: sugerenciasConservadas, iaMultiple: { enfoque: w.iaMultiple?.enfoque ?? '', cantidadDeSugerencias: w.iaMultiple?.cantidadDeSugerencias ?? 10, isLoading: true, }, })) try { const cantidad = wizard.iaMultiple?.cantidadDeSugerencias ?? 10 if (!Number.isFinite(cantidad) || cantidad <= 0 || cantidad > 15) { onChange((w) => ({ ...w, errorMessage: 'La cantidad de sugerencias debe ser entre 1 y 15.', iaMultiple: { enfoque: w.iaMultiple?.enfoque ?? '', cantidadDeSugerencias: w.iaMultiple?.cantidadDeSugerencias ?? 10, isLoading: false, }, })) return } const enfoqueTrim = wizard.iaMultiple?.enfoque.trim() ?? '' const nuevasSugerencias = await generate_subject_suggestions({ plan_estudio_id: wizard.plan_estudio_id, enfoque: enfoqueTrim ? enfoqueTrim : undefined, cantidad_de_sugerencias: cantidad, sugerencias_conservadas: sugerenciasConservadas.map((s) => ({ nombre: s.nombre, descripcion: s.descripcion, })), }) if (hadNoSugerenciasBefore && nuevasSugerencias.length > 0) { setShowConservacionTooltip(true) } onChange( (w): NewSubjectWizardState => ({ ...w, sugerencias: [...nuevasSugerencias, ...sugerenciasConservadas], iaMultiple: { enfoque: w.iaMultiple?.enfoque ?? '', cantidadDeSugerencias: w.iaMultiple?.cantidadDeSugerencias ?? 10, isLoading: false, }, }), ) } catch (err) { const message = err instanceof Error ? err.message : 'Error generando sugerencias.' onChange( (w): NewSubjectWizardState => ({ ...w, errorMessage: message, iaMultiple: { enfoque: w.iaMultiple?.enfoque ?? '', cantidadDeSugerencias: w.iaMultiple?.cantidadDeSugerencias ?? 10, isLoading: false, }, }), ) } } return ( <> {/* --- BLOQUE SUPERIOR: PARÁMETROS --- */}
Parámetros de sugerencia