"use client" import { useState } from 'react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Card } from '@/components/ui/card' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { analyzeFeatureWithAI } from '@/services/aiAnalysis' type Complexity = 'low' | 'medium' | 'high' export interface AIAnalysisResult { suggested_name?: string complexity?: Complexity implementation_details?: string[] technical_requirements?: string[] estimated_effort?: string dependencies?: string[] api_endpoints?: string[] database_tables?: string[] confidence_score?: number } export function AICustomFeatureCreator({ projectType, onAdd, onClose, editingFeature, }: { projectType?: string onAdd: (feature: { name: string; description: string; complexity: Complexity; logic_rules?: string[]; requirements?: Array<{ text: string; rules: string[] }>; business_rules?: Array<{ requirement: string; rules: string[] }> }) => void onClose: () => void editingFeature?: { id: string; name: string; description: string; complexity: Complexity; business_rules?: any; technical_requirements?: any; additional_business_rules?: any; } }) { const [featureName, setFeatureName] = useState(editingFeature?.name || '') const [featureDescription, setFeatureDescription] = useState(editingFeature?.description || '') const [selectedComplexity, setSelectedComplexity] = useState(editingFeature?.complexity || undefined) const [isAnalyzing, setIsAnalyzing] = useState(false) const [aiAnalysis, setAiAnalysis] = useState(() => { if (editingFeature) { return { suggested_name: editingFeature.name, complexity: editingFeature.complexity, confidence_score: 1, } } return null }) const [analysisError, setAnalysisError] = useState(null) const [requirements, setRequirements] = useState>(() => { // Initialize requirements from existing feature data if (editingFeature) { console.log('πŸ” Editing feature data:', editingFeature) try { // Try to get business rules from multiple sources let businessRules = null; // First try direct business_rules field if (editingFeature.business_rules) { console.log('πŸ“‹ Found business_rules field:', editingFeature.business_rules) businessRules = Array.isArray(editingFeature.business_rules) ? editingFeature.business_rules : (typeof editingFeature.business_rules === 'string' ? JSON.parse(editingFeature.business_rules) : editingFeature.business_rules) } // Then try additional_business_rules from feature_business_rules table else if ((editingFeature as any).additional_business_rules) { console.log('πŸ“‹ Found additional_business_rules field:', (editingFeature as any).additional_business_rules) businessRules = Array.isArray((editingFeature as any).additional_business_rules) ? (editingFeature as any).additional_business_rules : (typeof (editingFeature as any).additional_business_rules === 'string' ? JSON.parse((editingFeature as any).additional_business_rules) : (editingFeature as any).additional_business_rules) } // Also try technical_requirements field else if ((editingFeature as any).technical_requirements) { console.log('πŸ“‹ Found technical_requirements field:', (editingFeature as any).technical_requirements) const techReqs = Array.isArray((editingFeature as any).technical_requirements) ? (editingFeature as any).technical_requirements : (typeof (editingFeature as any).technical_requirements === 'string' ? JSON.parse((editingFeature as any).technical_requirements) : (editingFeature as any).technical_requirements) // Convert technical requirements to business rules format if (Array.isArray(techReqs)) { businessRules = techReqs.map((req: string, index: number) => ({ requirement: `Requirement ${index + 1}`, rules: [req] })) } } console.log('πŸ“‹ Parsed business rules:', businessRules) if (businessRules && Array.isArray(businessRules) && businessRules.length > 0) { const requirements = businessRules.map((rule: any) => ({ text: rule.requirement || rule.text || rule.name || `Requirement`, rules: Array.isArray(rule.rules) ? rule.rules : (rule.rules ? [rule.rules] : []) })) console.log('πŸ“‹ Mapped requirements:', requirements) return requirements.length > 0 ? requirements : [{ text: '', rules: [] }] } } catch (error) { console.error('Error parsing business rules:', error) } } return [{ text: '', rules: [] }] }) const [analyzingIdx, setAnalyzingIdx] = useState(null) const hasAnyAnalysis = !!aiAnalysis || requirements.some(r => (r.rules || []).length > 0) const handleAnalyze = async () => { if (hasAnyAnalysis) return if (!featureDescription.trim() && requirements.every(r => !r.text.trim())) return setIsAnalyzing(true) setAnalysisError(null) try { // Aggregate requirements texts for richer context const reqTexts = requirements.map(r => r.text).filter(t => t && t.trim()) const overall = await analyzeFeatureWithAI( featureName, featureDescription, reqTexts, projectType ) setAiAnalysis({ suggested_name: featureName, complexity: overall.complexity, // Using the complexity from the API response implementation_details: [], technical_requirements: [], estimated_effort: overall.complexity === 'high' ? 'High' : overall.complexity === 'low' ? 'Low' : 'Medium', dependencies: [], api_endpoints: [], database_tables: [], confidence_score: 0.9, }) // Generate logic rules per requirement in parallel and attach to each requirement const perRequirementRules = await Promise.all( requirements.map(async (r) => { try { const res = await analyzeFeatureWithAI( featureName, featureDescription, r.text ? [r.text] : [], projectType ) return Array.isArray(res?.logicRules) ? res.logicRules : [] } catch { return [] } }) ) setRequirements((prev) => prev.map((r, idx) => ({ ...r, rules: perRequirementRules[idx] || [] }))) } catch (e: any) { setAnalysisError(e?.message || 'AI analysis failed') } finally { setIsAnalyzing(false) } } const handleAnalyzeRequirement = async (idx: number) => { const req = requirements[idx] if (hasAnyAnalysis) return if (!req?.text?.trim()) return if ((req.rules || []).length > 0) return setAnalyzingIdx(idx) setAnalysisError(null) try { const res = await analyzeFeatureWithAI( featureName, featureDescription, [req.text], projectType ) const rules = Array.isArray(res?.logicRules) ? res.logicRules : [] setRequirements(prev => { const next = [...prev] next[idx] = { ...next[idx], rules } return next }) if (!aiAnalysis) { setAiAnalysis({ suggested_name: featureName, complexity: res?.complexity || 'medium', implementation_details: [], technical_requirements: [], estimated_effort: res?.complexity === 'high' ? 'High' : res?.complexity === 'low' ? 'Low' : 'Medium', dependencies: [], api_endpoints: [], database_tables: [], confidence_score: 0.9, }) } } catch (e: any) { setAnalysisError(e?.message || 'AI analysis failed') } finally { setAnalyzingIdx(null) } } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() onAdd({ name: aiAnalysis?.suggested_name || featureName.trim() || 'Custom Feature', description: featureDescription.trim(), complexity: aiAnalysis?.complexity || selectedComplexity || 'medium', logic_rules: requirements.flatMap(r => r.rules || []), requirements: requirements, business_rules: requirements.map(r => ({ requirement: r.text, rules: r.rules || [] })), }) onClose() } return (

{editingFeature ? 'Edit Custom Feature' : 'AI-Powered Feature Creator'}

setFeatureName(e.target.value)} placeholder="e.g., Subscriptions" className="bg-white/10 border-white/20 text-white placeholder:text-white/40" />