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}
/>
);
}