import { useState } from "react" import { Button } from "@/components/ui/button" import * as Icons from "lucide-react" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { AuroraButton } from "@/components/effect/aurora-button" import confetti from "canvas-confetti" import { supabase, useSupabaseAuth } from "@/auth/supabase" import { Field } from "./Field" import { Tabs, TabsContent, TabsList, TabsTrigger } from "../ui/tabs" import { useRouter } from "@tanstack/react-router" export function AddAsignaturaButton({ planId, onAdded }: { planId: string; onAdded?: () => void }) { const router = useRouter() const supabaseAuth = useSupabaseAuth() const [open, setOpen] = useState(false) const [saving, setSaving] = useState(false) const [mode, setMode] = useState<"manual" | "ia">("manual") const [f, setF] = useState({ nombre: "", clave: "", tipo: "", semestre: "", creditos: "", horas_teoricas: "", horas_practicas: "", objetivos: "" }) const [iaPrompt, setIaPrompt] = useState("") const [iaSemestre, setIaSemestre] = useState("") const toNull = (s: string) => s.trim() ? s : null const toNum = (s: string) => s.trim() ? Number(s) || null : null const canManual = f.nombre.trim().length > 0 const canIA = iaPrompt.trim().length > 0 const canSubmit = mode === "manual" ? canManual : canIA async function createManual() { if (!canManual) return setSaving(true) const payload = { plan_id: planId, nombre: f.nombre.trim(), clave: toNull(f.clave), tipo: toNull(f.tipo), semestre: toNum(f.semestre), creditos: toNum(f.creditos), horas_teoricas: toNum(f.horas_teoricas), horas_practicas: toNum(f.horas_practicas), objetivos: toNull(f.objetivos), contenidos: [], bibliografia: [], criterios_evaluacion: null, } const { error,data } = await supabase.from("asignaturas").insert([payload]).select().single() console.log(data); router.invalidate() router.navigate({ to: "/asignatura/$asignaturaId", params: { asignaturaId: data.id }, }) setSaving(false) if (error) { alert(error.message); return } setOpen(false) onAdded?.() } async function createWithAI() { if (!canIA) return setSaving(true) // inserte la asignatura generada directamente // obtengas el uuid que se insertó try { const res = await fetch(`${import.meta.env.VITE_BACK_ORIGIN}/api/generar/asignatura`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ planEstudiosId: planId, prompt: iaPrompt, semestre: iaSemestre.trim() ? Number(iaSemestre) : undefined, insert: true, uuid: supabaseAuth.user?.id }), }) if (!res.ok) throw new Error(await res.text()) const data = await res.json() console.log("Asignatura generada:", data) const asignaturaId = data.asignaturaId || data.insertResult?.id if (!asignaturaId) throw new Error("No se recibió el ID de la asignatura generada") confetti({ particleCount: 120, spread: 80, origin: { y: 0.6 } }) setOpen(false) router.invalidate() router.navigate({ to: "/asignatura/$asignaturaId", params: { asignaturaId }, }) onAdded?.() // qc.invalidateQueries({ queryKey: asignaturaKeys.preview(planId) }) // qc.invalidateQueries({ queryKey: asignaturaKeys.count(planId) }) } catch (e: any) { alert(e?.message ?? "Error al generar la asignatura") } finally { setSaving(false) } } const submit = () => (mode === "manual" ? createManual() : createWithAI()) return ( <> setOpen(true)}> Nueva asignatura Nueva asignatura Elige cómo crearla: manual o generada por IA. setMode(v as "manual" | "ia")} className="w-full"> Manual Generado por IA setF(s => ({ ...s, nombre: e.target.value }))} /> setF(s => ({ ...s, clave: e.target.value }))} /> setF(s => ({ ...s, tipo: e.target.value }))} placeholder="Obligatoria / Optativa / Taller…" /> setF(s => ({ ...s, semestre: e.target.value }))} placeholder="1–10" /> setF(s => ({ ...s, creditos: e.target.value }))} /> setF(s => ({ ...s, horas_teoricas: e.target.value }))} /> setF(s => ({ ...s, horas_practicas: e.target.value }))} /> setF(s => ({ ...s, objetivos: e.target.value }))} className="min-h-[90px]" /> setIaPrompt(e.target.value)} className="min-h-[120px]" placeholder="Ej.: Diseña una materia de Programación Web con proyectos, evaluación por rúbricas y bibliografía actual…" /> setIaSemestre(e.target.value)} placeholder="1–10" /> setOpen(false)}>Cancelar {saving ? (mode === "manual" ? "Guardando…" : "Generando…") : (mode === "manual" ? "Crear" : "Generar e insertar")} > ) }