"use client"; import { useEffect, useState } from "react"; import { fetchAllPatterns, fetchAllSignals, Pattern, Signal } from "../lib/api"; type CardMetric = { type: string; label: string; value: string; width?: string; valueDim?: boolean; }; type CardData = { icon: string; iconBg: string; iconBorder: string; iconColor: string; title: string; pulse?: boolean; time: string; description: string; metrics?: CardMetric[]; recommendation?: string; footerLabel: string; footerIcon: string; footerDim: boolean; }; const STATIC_CARDS = [ { icon: "subject", iconBg: "rgba(167,139,250,0.1)", iconBorder: "rgba(167,139,250,0.2)", iconColor: "#A78BFA", title: "SEMANTIC_PROCESSOR", }, { icon: "mood", iconBg: "rgba(167,139,250,0.1)", iconBorder: "rgba(167,139,250,0.2)", iconColor: "#A78BFA", title: "SENTIMENT_MINER", }, { icon: "schema", iconBg: "rgba(249,245,248,0.05)", iconBorder: "rgba(255,255,255,0.1)", iconColor: "rgba(249,245,248,0.4)", title: "PATTERN_DETECTOR", }, ]; export default function IntelligenceCards() { const [patterns, setPatterns] = useState([]); const [signals, setSignals] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { async function load() { try { const [ptns, allGroups] = await Promise.all([ fetchAllPatterns(), fetchAllSignals(), ]); setPatterns(ptns); setSignals(allGroups.flatMap((g) => g.signals)); } catch { // ignore } finally { setLoading(false); } } load(); }, []); const totalSignals = signals.length; const sentimentSignals = signals.filter( (s) => s.metadata.type.includes("sentiment") || s.metadata.sentiment !== "neutral" ); const avgSentiment = sentimentSignals.length > 0 ? `${Math.round((sentimentSignals.length / Math.max(totalSignals, 1)) * 100)}%` : "—"; const activePatterns = patterns.filter((p) => p.is_active); const criticalPatterns = patterns.filter((p) => p.severity === "critical"); const cardData: CardData[] = [ { ...STATIC_CARDS[0], time: loading ? "LOADING..." : `${totalSignals} SIGNALS`, description: loading ? "Loading signal data..." : `Processing deep contextual inference across ${totalSignals} signals. Semantic alignment analysis running across all active node clusters.`, metrics: [ { type: "bar", label: "Coverage", value: totalSignals > 0 ? "active" : "0%", width: totalSignals > 0 ? "88%" : "0%", }, { type: "row", label: "Signals Indexed", value: String(totalSignals), }, ], footerLabel: "Inference Details", footerIcon: "arrow_forward", footerDim: false, }, { ...STATIC_CARDS[1], pulse: true, time: loading ? "LOADING..." : `${sentimentSignals.length} SAMPLES`, description: loading ? "Loading sentiment data..." : `Identifying emotional flux patterns within communications. Analyzed ${sentimentSignals.length} sentiment-bearing signals out of ${totalSignals} total.`, recommendation: sentimentSignals.length > 0 ? `${avgSentiment} of signals carry sentiment signals. Monitor channels with high emotional flux.` : undefined, footerLabel: "Refine Analysis", footerIcon: "arrow_forward", footerDim: false, }, { ...STATIC_CARDS[2], time: loading ? "LOADING..." : `${activePatterns.length} ACTIVE`, description: loading ? "Loading pattern data..." : activePatterns.length > 0 ? `${activePatterns.length} active patterns detected across all groups. ${criticalPatterns.length} require immediate attention.` : "No patterns detected yet. Patterns emerge as more signals are processed.", metrics: activePatterns.length > 0 ? [ { type: "row", label: "Active Patterns", value: String(activePatterns.length), valueDim: false, }, { type: "row", label: "Critical", value: criticalPatterns.length > 0 ? `${criticalPatterns.length} CRITICAL` : "NONE", valueDim: criticalPatterns.length > 0, }, ] : [ { type: "row", label: "Status", value: "Accumulating data", valueDim: true, }, ], footerLabel: activePatterns.length > 0 ? "View Patterns" : "System Initializing", footerIcon: activePatterns.length > 0 ? "arrow_forward" : "hourglass_empty", footerDim: activePatterns.length === 0, }, ]; type CardMetric = { type: string; label: string; value: string; width?: string; valueDim?: boolean; }; return (
{cardData.map((card, idx) => (
{/* Background Glow */}
{/* Card Header */}
{card.icon}
{card.time}
{/* Card Body */}

{card.title}

{card.description}

{card.recommendation && (
Recommended Action

{card.recommendation}

)} {card.metrics && (
{(card.metrics as CardMetric[]).map((m) => m.type === "bar" ? (
{m.label} {m.value}
) : (
{m.label} {m.value}
) )}
)}
{/* Card Footer */}
{card.footerLabel} {card.footerIcon}
))}
); }