import { useNavigate } from '@tanstack/react-router' import * as Icons from 'lucide-react' import { useNuevoPlanWizard } from './hooks/useNuevoPlanWizard' import type { NewPlanWizardState } from './types' import { PasoBasicosForm } from '@/components/planes/wizard/PasoBasicosForm/PasoBasicosForm' import { PasoDetallesPanel } from '@/components/planes/wizard/PasoDetallesPanel/PasoDetallesPanel' import { PasoModoCardGroup } from '@/components/planes/wizard/PasoModoCardGroup' import { PasoResumenCard } from '@/components/planes/wizard/PasoResumenCard' import { WizardControls } from '@/components/planes/wizard/WizardControls' import { WizardHeader } from '@/components/planes/wizard/WizardHeader' import { defineStepper } from '@/components/stepper' import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card' import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { useGeneratePlanAI } from '@/data/hooks/usePlans' // Mock de permisos/rol const auth_get_current_user_role = () => 'JEFE_CARRERA' as const const Wizard = defineStepper( { id: 'modo', title: 'Método', description: 'Selecciona cómo crearás el plan', }, { id: 'basicos', title: 'Datos básicos', description: 'Nombre, carrera, nivel y ciclos', }, { id: 'detalles', title: 'Detalles', description: 'IA, clonado o archivos' }, { id: 'resumen', title: 'Resumen', description: 'Confirma y crea el plan' }, ) export default function NuevoPlanModalContainer() { const navigate = useNavigate() const role = auth_get_current_user_role() const generatePlanAI = useGeneratePlanAI() // const persistPlanFromAI = usePersistPlanFromAI() const { wizard, setWizard, canContinueDesdeModo, canContinueDesdeBasicos, canContinueDesdeDetalles, } = useNuevoPlanWizard() const handleClose = () => { navigate({ to: '/planes', resetScroll: false }) } const crearPlan = async () => { setWizard( (w: NewPlanWizardState): NewPlanWizardState => ({ ...w, isLoading: true, errorMessage: null, }), ) try { if (wizard.tipoOrigen === 'IA') { const tipoCicloSafe = (wizard.datosBasicos.tipoCiclo || 'Semestre') as any const numCiclosSafe = typeof wizard.datosBasicos.numCiclos === 'number' ? wizard.datosBasicos.numCiclos : 1 const aiInput = { datosBasicos: { nombrePlan: wizard.datosBasicos.nombrePlan, carreraId: wizard.datosBasicos.carreraId, facultadId: wizard.datosBasicos.facultadId || undefined, nivel: wizard.datosBasicos.nivel as string, tipoCiclo: tipoCicloSafe, numCiclos: numCiclosSafe, estructuraPlanId: wizard.datosBasicos.estructuraPlanId as string, }, iaConfig: { descripcionEnfoque: wizard.iaConfig?.descripcionEnfoque || '', notasAdicionales: wizard.iaConfig?.notasAdicionales || '', archivosReferencia: wizard.iaConfig?.archivosReferencia || [], repositoriosIds: wizard.iaConfig?.repositoriosReferencia || [], archivosAdjuntos: wizard.iaConfig?.archivosAdjuntos || [], }, } const response = await generatePlanAI.mutateAsync(aiInput as any) // const createdPlan = await persistPlanFromAI.mutateAsync({ // jsonPlan: generatedJson, // }) // navigate({ to: `/planes/${createdPlan.id}` }) console.log('Plan generado por IA:', response) return } // Fallback: comportamiento previo para otros modos (mock IDs) await new Promise((r) => setTimeout(r, 900)) const nuevoId = (() => { if (wizard.tipoOrigen === 'MANUAL') return 'plan_new_manual_001' if ( wizard.tipoOrigen === 'CLONADO_INTERNO' || wizard.tipoOrigen === 'CLONADO_TRADICIONAL' ) return 'plan_new_clone_001' return 'plan_new_import_001' })() navigate({ to: `/planes/${nuevoId}` }) } catch (err: any) { setWizard((w) => ({ ...w, isLoading: false, errorMessage: err?.message ?? 'Error generando el plan con IA', })) } finally { setWizard((w) => ({ ...w, isLoading: false })) } } return ( !open && handleClose()}> { e.preventDefault() }} > {role !== 'JEFE_CARRERA' ? ( <> Nuevo plan de estudios
Sin permisos No tienes permisos para crear planes de estudio.
) : ( {({ methods }) => { const currentIndex = Wizard.utils.getIndex(methods.current.id) + 1 const totalSteps = Wizard.steps.length const nextStep = Wizard.steps[currentIndex] ?? { title: '', description: '', } return ( <>
{Wizard.utils.getIndex(methods.current.id) === 0 && ( )} {Wizard.utils.getIndex(methods.current.id) === 1 && ( )} {Wizard.utils.getIndex(methods.current.id) === 2 && ( )} {Wizard.utils.getIndex(methods.current.id) === 3 && ( )}
methods.prev()} onNext={() => methods.next()} onCreate={crearPlan} disablePrev={ Wizard.utils.getIndex(methods.current.id) === 0 || wizard.isLoading } disableNext={ wizard.isLoading || (Wizard.utils.getIndex(methods.current.id) === 0 && !canContinueDesdeModo) || (Wizard.utils.getIndex(methods.current.id) === 1 && !canContinueDesdeBasicos) || (Wizard.utils.getIndex(methods.current.id) === 2 && !canContinueDesdeDetalles) } disableCreate={wizard.isLoading} isLastStep={ Wizard.utils.getIndex(methods.current.id) >= Wizard.steps.length - 1 } />
) }}
)}
) }