import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { supabase } from "@/integrations/supabase/client"; import { completaTurni } from "./palloni-core"; import { useEventi } from "./eventi"; import { nomeCompleto, useGiocatoriSquadra } from "./giocatori-squadra"; export const TURNI_KEY = ["turni-palloni"] as const; type RigaTurno = { evento_id: string; giocatore_id: string; aggiornato_da: string | null; }; async function fetchTurni(): Promise> { const { data, error } = await supabase .from("turni_palloni") .select("evento_id, giocatore_id, aggiornato_da"); if (error) throw error; const mappa: Record = {}; for (const riga of (data ?? []) as RigaTurno[]) mappa[riga.evento_id] = riga.giocatore_id; return mappa; } /** Turni salvati + proposta automatica a rotazione per gli eventi non ancora assegnati. */ export function useTurniPalloni() { // Cambia raramente: una lettura per sessione รจ sufficiente. const query = useQuery({ queryKey: TURNI_KEY, queryFn: fetchTurni, staleTime: 30 * 60_000 }); const { eventi } = useEventi(); const { righe: squadra } = useGiocatoriSquadra(); const salvati = query.data ?? {}; const rosa = squadra.filter((g) => g.attivo).map((g) => ({ id: g.id, nome: nomeCompleto(g) })); return { ...query, salvati, turni: completaTurni(salvati, eventi, rosa) }; } export function useAssegnaTurno() { const queryClient = useQueryClient(); return useMutation({ mutationFn: async (input: { eventoId: string; giocatoreId: string; da: string | null }) => { const { error } = await supabase.from("turni_palloni").upsert( { evento_id: input.eventoId, giocatore_id: input.giocatoreId, aggiornato_da: input.da, aggiornato_il: new Date().toISOString(), }, { onConflict: "evento_id" }, ); if (error) throw error; return input; }, // Scrittura unica + aggiornamento cache locale, senza rilettura. onSuccess: (input) => { queryClient.setQueryData>(TURNI_KEY, (prec) => ({ ...(prec ?? {}), [input.eventoId]: input.giocatoreId, })); }, }); }