import { useGridStore } from "@/features/grid/store/use-grid-store"; import { useAiCopilotStore } from "@/features/ai-copilot/store/use-ai-copilot-store"; import { BulkAiAnalyzer } from "./bulk-ai-analyzer"; import { useSaveDrafts } from "@/features/grid/hooks/use-save-drafts"; import { Loader2, CheckCircle, AlertCircle, RotateCcw, Camera } from "lucide-react"; import { useState, useTransition } from "react"; import { saveSnapshot } from "@/features/snapshots/api/save-snapshot"; function Stat({ label, value, sub }: { label: string; value: string; sub?: string }) { // Determine color based on label to match the prototype const valColor = label.includes("CA") || label.includes("Marge") ? "text-emerald-600 dark:text-emerald-400" : "text-slate-900 dark:text-white"; return (
{label} {value} {sub && {sub}}
); } export function FloatingSummaryBar() { const { summary, resetDrafts, rows, filters, draftChanges } = useGridStore(); const { resetInsights } = useAiCopilotStore(); const [isPending, startTransition] = useTransition(); const [isSavingSnapshot, setIsSavingSnapshot] = useState(false); const [saveStatus, setSaveStatus] = useState<"idle" | "success" | "error">("idle"); const visibleCodeins = rows.map(r => r.codein); const { save, hasDrafts, count } = useSaveDrafts(filters.magasin || "TOTAL", visibleCodeins); const handleSave = () => { startTransition(async () => { const result = await save(); setSaveStatus(result.success ? "success" : "error"); setTimeout(() => setSaveStatus("idle"), 3000); }); }; const handleReset = () => { if (window.confirm("Es-tu sûr de vouloir annuler tous les changements non enregistrés (gammes et analyses IA) ?")) { resetDrafts(); resetInsights(); } }; const handleSnapshot = async (labelOverride?: string) => { if (rows.length === 0) return; setIsSavingSnapshot(true); try { const modifiedRows = rows.filter(r => draftChanges[r.codein]); const changes = Object.fromEntries( modifiedRows.map(r => [ r.codein, { before: r.codeGamme, after: draftChanges[r.codein] as string } ]) ); const res = await saveSnapshot({ codeFournisseur: filters.codeFournisseur || rows[0].codeFournisseur, nomFournisseur: rows[0].nomFournisseur, magasin: filters.magasin || "TOTAL", label: labelOverride || `Session ${rows[0].nomFournisseur} — ${new Date().toLocaleTimeString()}`, changes, summary: { totalRows: summary.totalRows, totalCa: summary.totalCa, totalMarge: summary.totalMarge, tauxMargeGlobal: summary.tauxMargeGlobal, } }); if (res.success) { if (!labelOverride) alert("Snapshot enregistré avec succès ! Retrouvez-le dans la page Snapshots."); return res.snapshotId; } else { throw new Error(res.error); } } catch (err) { console.error(err); if (!labelOverride) alert("Erreur lors de la création du snapshot."); } finally { setIsSavingSnapshot(false); } }; return (
{hasDrafts && ( {count} modif. )}
); }