import { useState } from 'react'; import { Sparkles, Check, ArrowLeft } from 'lucide-react'; import { DetailPopup } from '../../components/DetailPopup.jsx'; import { Button } from '../../components/Button.jsx'; import { Field, FieldRow } from '../../components/Field.jsx'; import { ComboBox } from '../../components/ComboBox.jsx'; import { InfoBar } from '../../components/InfoBar.jsx'; import { useUi } from '../../context/ui-context.jsx'; import { useAuth } from '../../context/auth-context.jsx'; import { proposeNewProject, createNewProject } from '../../services/ai.js'; const today = () => new Date().toISOString().slice(0, 10); // Asistente por pasos: 1) objetivo + departamento + fecha (validados aqui, antes de gastar tokens); // 2) una sola llamada a la IA; 3) revision y creacion. Estado, responsable y miembros los fija el // backend (Planificado / quien crea). Si el texto no es un proyecto, la IA lo rechaza. export function NewProjectAiDialog({ open, deptOptions, minLength = 20, onClose, onCreated }) { const { t, lang } = useUi(); const { user } = useAuth(); const [objective, setObjective] = useState(''); const [departmentId, setDepartmentId] = useState(user?.departmentId || ''); const [startDate, setStartDate] = useState(today()); const [proposal, setProposal] = useState(null); const [name, setName] = useState(''); const [selected, setSelected] = useState([]); const [busy, setBusy] = useState(false); const [error, setError] = useState(''); const objectiveOk = objective.trim().length >= minLength; const dateOk = /^\d{4}-\d{2}-\d{2}$/.test(startDate); const canGenerate = objectiveOk && departmentId && dateOk && !busy; function close() { if (busy) return; setProposal(null); setSelected([]); setError(''); setObjective(''); setName(''); setStartDate(today()); onClose(); } async function generate() { setBusy(true); setError(''); try { const p = await proposeNewProject({ objective, startDate, lang }); setProposal(p); setName(p.name); setSelected(p.activities.map((_, i) => i)); } catch (err) { setError(err.message); } finally { setBusy(false); } } async function create() { setBusy(true); setError(''); try { const r = await createNewProject({ objective: proposal.objective || objective, startDate, name, description: proposal.description, projectTypeId: proposal.projectTypeId, requestingDepartmentId: departmentId, activities: proposal.activities.filter((_, i) => selected.includes(i)), }); setBusy(false); close(); onCreated(r); } catch (err) { setError(err.message); setBusy(false); } } const toggle = (i) => setSelected((s) => (s.includes(i) ? s.filter((x) => x !== i) : [...s, i])); return ( {error && {error}} {!proposal ? ( <>