"use client"; import { useState, useEffect, useCallback } from "react"; import type { Stabilimento, Magazzino, StabilimentoWithMagazzini } from "@/src/types/stabilimento"; import { useStabilimento } from "@/src/contexts/StabilimentoContext"; function FormModal({ title, onClose, onSubmit, children, submitLabel, }: { title: string; onClose: () => void; onSubmit: (e: React.FormEvent) => void; children: React.ReactNode; submitLabel: string; }) { return (

{title}

{children}
); } export default function StabilimentiManager() { const { reload } = useStabilimento(); const [stabilimenti, setStabilimenti] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [search, setSearch] = useState(""); const [stabModal, setStabModal] = useState<"create" | "edit" | null>(null); const [magModal, setMagModal] = useState<"create" | "edit" | null>(null); const [editingStabilimento, setEditingStabilimento] = useState(null); const [editingMagazzino, setEditingMagazzino] = useState(null); const [presetStabilimentoId, setPresetStabilimentoId] = useState(null); const [stabDescrizione, setStabDescrizione] = useState(""); const [magDescrizione, setMagDescrizione] = useState(""); const [magStabilimentoId, setMagStabilimentoId] = useState(""); const loadData = useCallback(async () => { setLoading(true); setError(null); try { const res = await fetch("/api/stabilimenti?includeMagazzini=true"); if (!res.ok) throw new Error("Errore nel caricamento"); const data = await res.json(); setStabilimenti(data.stabilimenti || []); } catch (err) { setError(err instanceof Error ? err.message : "Errore sconosciuto"); } finally { setLoading(false); } }, []); useEffect(() => { loadData(); }, [loadData]); const afterMutation = async () => { await loadData(); await reload(); }; const openCreateStabilimento = () => { setEditingStabilimento(null); setStabDescrizione(""); setStabModal("create"); }; const openEditStabilimento = (stab: Stabilimento) => { setEditingStabilimento(stab); setStabDescrizione(stab.descrizione); setStabModal("edit"); }; const openCreateMagazzino = (stabilimentoId?: number) => { setEditingMagazzino(null); setMagDescrizione(""); setMagStabilimentoId(stabilimentoId?.toString() || ""); setPresetStabilimentoId(stabilimentoId ?? null); setMagModal("create"); }; const openEditMagazzino = (mag: Magazzino) => { setEditingMagazzino(mag); setMagDescrizione(mag.descrizione); setMagStabilimentoId(mag.id_stabilimento.toString()); setMagModal("edit"); }; const handleStabilimentoSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); try { const url = stabModal === "edit" && editingStabilimento ? `/api/stabilimenti/${editingStabilimento.id}` : "/api/stabilimenti"; const method = stabModal === "edit" ? "PUT" : "POST"; const res = await fetch(url, { method, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ descrizione: stabDescrizione }), }); const data = await res.json(); if (!res.ok) throw new Error(data.error || "Operazione fallita"); setStabModal(null); await afterMutation(); } catch (err) { setError(err instanceof Error ? err.message : "Errore"); } }; const handleMagazzinoSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); try { const url = magModal === "edit" && editingMagazzino ? `/api/magazzini/${editingMagazzino.id}` : "/api/magazzini"; const method = magModal === "edit" ? "PUT" : "POST"; const res = await fetch(url, { method, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ descrizione: magDescrizione, id_stabilimento: parseInt(magStabilimentoId, 10), }), }); const data = await res.json(); if (!res.ok) throw new Error(data.error || "Operazione fallita"); setMagModal(null); await afterMutation(); } catch (err) { setError(err instanceof Error ? err.message : "Errore"); } }; const handleDeleteStabilimento = async (id: number, nome: string) => { if (!confirm(`Eliminare lo stabilimento "${nome}"?`)) return; setError(null); try { const res = await fetch(`/api/stabilimenti/${id}`, { method: "DELETE" }); const data = await res.json(); if (!res.ok) throw new Error(data.error || "Eliminazione fallita"); await afterMutation(); } catch (err) { setError(err instanceof Error ? err.message : "Errore"); } }; const handleDeleteMagazzino = async (id: number, nome: string) => { if (!confirm(`Eliminare il magazzino "${nome}"?`)) return; setError(null); try { const res = await fetch(`/api/magazzini/${id}`, { method: "DELETE" }); const data = await res.json(); if (!res.ok) throw new Error(data.error || "Eliminazione fallita"); await afterMutation(); } catch (err) { setError(err instanceof Error ? err.message : "Errore"); } }; const filtered = stabilimenti.filter((s) => s.descrizione.toLowerCase().includes(search.toLowerCase()) ); const totalMagazzini = stabilimenti.reduce((n, s) => n + s.magazzini.length, 0); return (

Stabilimenti e Magazzini

Anagrafica sedi produttive e magazzini associati

Stabilimenti

{stabilimenti.length}

Magazzini totali

{totalMagazzini}

{error && (
{error}
)}
setSearch(e.target.value)} placeholder="Cerca stabilimenti..." className="w-full md:max-w-md px-4 py-2 rounded-lg bg-zinc-900 border border-zinc-800 text-white placeholder-zinc-500 focus:outline-none focus:border-blue-500" />
{loading ? (
Caricamento...
) : filtered.length === 0 ? (

Nessuno stabilimento

{search ? "Nessun risultato per la ricerca" : "Aggiungi il primo stabilimento"}

{!search && ( )}
) : (
{filtered.map((stab) => (
🏭

{stab.descrizione}

{stab.magazzini.length} magazzin{stab.magazzini.length === 1 ? "o" : "i"}

{stab.magazzini.length === 0 ? (

Nessun magazzino associato

) : (
    {stab.magazzini.map((mag) => (
  • 📦 {mag.descrizione}
  • ))}
)}
))}
)} {stabModal && ( setStabModal(null)} onSubmit={handleStabilimentoSubmit} submitLabel={stabModal === "edit" ? "Salva" : "Crea"} >
setStabDescrizione(e.target.value)} required className="w-full px-3 py-2 rounded-lg bg-zinc-950 border border-zinc-700 text-white focus:outline-none focus:border-blue-500" placeholder="Es. Stabilimento Gonzaga" />
)} {magModal && ( setMagModal(null)} onSubmit={handleMagazzinoSubmit} submitLabel={magModal === "edit" ? "Salva" : "Crea"} >
setMagDescrizione(e.target.value)} required className="w-full px-3 py-2 rounded-lg bg-zinc-950 border border-zinc-700 text-white focus:outline-none focus:border-blue-500" placeholder="Es. Magazzino ricambi" />
)}
); }