'use client'; import React from 'react'; import { X, Brain, TrendingUp, Database, Zap } from 'lucide-react'; interface Question { id: string; label: string; type: 'text' | 'select' | 'multiselect' | 'textarea'; options?: string[]; required?: boolean; placeholder?: string; tooltip?: string; agent_source?: string; relevance?: number; } interface QuestionnaireData { title?: string; subtitle?: string; questions?: Question[]; fields?: Question[]; explanation?: string; data_requirements?: { minimum_samples?: number; preferred_samples?: number; quality_factors?: Record; }; confidence_score?: number; ai_decision_trace?: { agent_sources?: string[]; }; } interface QuestionnaireProps { isOpen: boolean; onClose: () => void; onSubmit: (answers: Record) => void; isSubmitting?: boolean; workflowId?: string; questionnaireData?: QuestionnaireData | null; } const UnifiedQuestionnaire: React.FC = ({ isOpen, onClose, onSubmit, isSubmitting = false, workflowId, questionnaireData }) => { // Default questions if no dynamic questionnaire data const defaultQuestions: Question[] = [ { id: "problem_domain", label: "What type of AI are you building?", type: "select", options: ["vision", "text", "audio", "data", "multimodal"], required: true, tooltip: "This helps us choose the right model architecture" }, { id: "primary_objective", label: "What do you want your AI to do?", type: "textarea", placeholder: "Describe in simple terms, like 'identify cats in photos' or 'predict tomorrow's weather'", required: true }, { id: "data_availability", label: "Do you have example data to train with?", type: "select", options: ["yes", "some", "no"], required: true }, { id: "data_sources", label: "Where should we look for training data?", type: "multiselect", options: ["files", "database", "apis", "events", "logs", "auto"], required: true } ]; // Use dynamic questions if available, otherwise fall back to defaults const questions = questionnaireData?.questions || questionnaireData?.fields || defaultQuestions; const title = questionnaireData?.title || "AI Model Personalization Questionnaire"; const subtitle = questionnaireData?.subtitle || `${questions.length} questions to optimize your AI model`; const explanation = questionnaireData?.explanation || "Answer these questions to help us create the perfect AI solution for you."; const confidenceScore = questionnaireData?.confidence_score || 0.5; const [answers, setAnswers] = React.useState>({}); const [isLoading, setIsLoading] = React.useState(false); // Initialize answers once on open or when the questions array identity changes meaningfully React.useEffect(() => { if (!isOpen) return; if (questions.length === 0) return; // Only initialize if answers are empty (avoid loops) if (Object.keys(answers).length === 0) { const initial: Record = {}; for (const q of questions) { initial[q.id] = q.type === 'multiselect' ? [] : ''; } setAnswers(initial); } }, [isOpen, questions, answers]); // Reset when a new questionnaire arrives while modal is open React.useEffect(() => { if (!isOpen) return; const newQs = questionnaireData?.questions || questionnaireData?.fields; if (newQs && newQs.length > 0) { const newIds = new Set(newQs.map(q => q.id)); const currentIds = new Set(Object.keys(answers)); let same = newIds.size === currentIds.size && [...newIds].every(id => currentIds.has(id)); if (!same) { const initial: Record = {}; for (const q of newQs) initial[q.id] = q.type === 'multiselect' ? [] : ''; setAnswers(initial); } } }, [isOpen, questionnaireData]); if (!isOpen) return null; const handleSubmit = () => { // Validate required fields const missingRequired = questions.filter(q => q.required && (!answers[q.id] || (Array.isArray(answers[q.id]) && answers[q.id].length === 0)) ); if (missingRequired.length > 0) { alert(`Please fill in all required fields: ${missingRequired.map(q => q.label).join(', ')}`); return; } console.log('📋 Submitting questionnaire with answers:', answers); onSubmit(answers); }; const handleClose = () => { console.log('❌ Questionnaire closed by user'); onClose(); }; const updateAnswer = (questionId: string, value: any) => { setAnswers(prev => ({ ...prev, [questionId]: value })); }; return (
{/* Header */}

{title}

{subtitle}

{/* Content */}
{/* Explanation */} {explanation && (

{explanation}

{questionnaireData?.data_requirements && (

📊 Data Requirements:

Minimum samples: {questionnaireData.data_requirements.minimum_samples?.toLocaleString()}
Preferred samples: {questionnaireData.data_requirements.preferred_samples?.toLocaleString()}
)}
)} {isLoading ? (
Loading intelligent questionnaire...
) : ( /* Dynamic Questions */ questions.map((question, index) => (
{question.relevance && ( {(question.relevance * 100).toFixed(0)}% relevant )}
{question.tooltip && (

{question.tooltip}

)} {/* Question Input */} {question.type === 'text' && ( updateAnswer(question.id, e.target.value)} placeholder={question.placeholder} className="w-full bg-gray-800 border border-gray-700 rounded-lg px-4 py-3 text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all" /> )} {question.type === 'textarea' && (