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"; import { SuccessModal } from "@/components/shared/success-modal"; 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 [modal, setModal] = useState<{ isOpen: boolean, title: string, message: string }>({ isOpen: false, title: "", message: "" }); 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, type: "snapshot" | "export" = "snapshot") => { 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 || `${type === 'export' ? 'Export' : 'Session'} ${rows[0].nomFournisseur} — ${new Date().toLocaleTimeString()}`, changes, type, summary: { totalRows: summary.totalRows, totalCa: summary.totalCa, totalMarge: summary.totalMarge, tauxMargeGlobal: summary.tauxMargeGlobal, } }); if (res.success) { if (!labelOverride) { setModal({ isOpen: true, title: "Snapshot Enregistré", message: "Votre session de travail a été sauvegardée avec succès." }); } return res.snapshotId; } else { throw new Error(res.error); } } catch (err) { console.error(err); if (!labelOverride) { const msg = err instanceof Error ? err.message : String(err); setModal({ isOpen: true, title: "Erreur Snapshot", message: `Impossible de créer le snapshot : ${msg}` }); } } finally { setIsSavingSnapshot(false); } }; return (
{hasDrafts && ( <>
{count} MODIF. )}
setModal(prev => ({ ...prev, isOpen: false }))} title={modal.title} message={modal.message} />
); }