// ================================================================
// frontend/src/components/dashboard/OrchestrationSummaryCard.tsx
// ================================================================
/**
* Orchestration Summary Card - What the system did for you
*
* Builds trust by showing transparency into automation decisions.
* Narrative format makes it feel like a helpful assistant.
*/
import React, { useState } from 'react';
import {
Bot,
TrendingUp,
Package,
Clock,
CheckCircle,
FileText,
Users,
Database,
Brain,
ChevronDown,
ChevronUp,
} from 'lucide-react';
import { OrchestrationSummary } from '../../api/hooks/newDashboard';
import { formatDistanceToNow } from 'date-fns';
import { useTranslation } from 'react-i18next';
interface OrchestrationSummaryCardProps {
summary: OrchestrationSummary;
loading?: boolean;
}
export function OrchestrationSummaryCard({ summary, loading }: OrchestrationSummaryCardProps) {
const [expanded, setExpanded] = useState(false);
const { t } = useTranslation('reasoning');
if (loading) {
return (
);
}
// Handle case where no orchestration has run yet
if (summary.status === 'no_runs') {
return (
{t('jtbd.orchestration_summary.ready_to_plan')}
{summary.message}
);
}
const runTime = summary.runTimestamp
? formatDistanceToNow(new Date(summary.runTimestamp), { addSuffix: true })
: 'recently';
return (
{/* Header */}
{t('jtbd.orchestration_summary.title')}
{t('jtbd.orchestration_summary.run_info', { runNumber: summary.runNumber })} • {runTime}
{summary.durationSeconds && (
• {t('jtbd.orchestration_summary.took', { seconds: summary.durationSeconds })}
)}
{/* Purchase Orders Created */}
{summary.purchaseOrdersCreated > 0 && (
{t('jtbd.orchestration_summary.created_pos', { count: summary.purchaseOrdersCreated })}
{summary.purchaseOrdersSummary.length > 0 && (
{summary.purchaseOrdersSummary.map((po, index) => (
-
{po.supplierName}
{' • '}
{po.itemCategories.slice(0, 2).join(', ')}
{po.itemCategories.length > 2 && ` +${po.itemCategories.length - 2} more`}
{' • '}
€{po.totalAmount.toFixed(2)}
))}
)}
)}
{/* Production Batches Created */}
{summary.productionBatchesCreated > 0 && (
{t('jtbd.orchestration_summary.scheduled_batches', {
count: summary.productionBatchesCreated,
})}
{summary.productionBatchesSummary.length > 0 && (
{summary.productionBatchesSummary.slice(0, expanded ? undefined : 3).map((batch, index) => (
-
{batch.quantity} {batch.productName}
{' • '}
ready by {new Date(batch.readyByTime).toLocaleTimeString('en-US', {
hour: 'numeric',
minute: '2-digit',
hour12: true,
})}
))}
)}
{summary.productionBatchesSummary.length > 3 && (
)}
)}
{/* No actions created */}
{summary.purchaseOrdersCreated === 0 && summary.productionBatchesCreated === 0 && (
{t('jtbd.orchestration_summary.no_actions')}
)}
{/* Reasoning Inputs (How decisions were made) */}
{t('jtbd.orchestration_summary.based_on')}
{summary.reasoningInputs.customerOrders > 0 && (
{t('jtbd.orchestration_summary.customer_orders', {
count: summary.reasoningInputs.customerOrders,
})}
)}
{summary.reasoningInputs.historicalDemand && (
{t('jtbd.orchestration_summary.historical_demand')}
)}
{summary.reasoningInputs.inventoryLevels && (
{t('jtbd.orchestration_summary.inventory_levels')}
)}
{summary.reasoningInputs.aiInsights && (
{t('jtbd.orchestration_summary.ai_optimization')}
)}
{/* Actions Required Footer */}
{summary.userActionsRequired > 0 && (
{t('jtbd.orchestration_summary.actions_required', {
count: summary.userActionsRequired,
})}
)}
);
}