import { useEffect } from 'react';
import { useQueryClient } from '@tanstack/react-query';
import { signalRService } from '../services/signalr';

// Mappa entity types a query keys
const entityToQueryKeys: Record<string, string[]> = {
  eventi: ['eventi', 'evento', 'calendario'],
  clienti: ['clienti', 'lookup'],
  location: ['location', 'lookup'],
  risorse: ['risorse', 'lookup'],
  articoli: ['articoli', 'lookup'],
  'evento-costi': ['evento-costi', 'evento'],
  demo: ['eventi', 'clienti', 'location', 'risorse', 'articoli', 'calendario', 'lookup'],
};

/**
 * Hook per abilitare gli aggiornamenti in tempo reale
 * Invalida automaticamente le query quando arrivano notifiche dal server
 */
export function useRealTimeUpdates() {
  const queryClient = useQueryClient();

  useEffect(() => {
    const unsubscribe = signalRService.subscribe((entityType, action, data) => {
      console.log(`Real-time update: ${entityType} ${action}`, data);

      // Trova le query keys da invalidare
      const queryKeys = entityToQueryKeys[entityType] || [entityType];

      // Invalida le query correlate
      queryKeys.forEach(key => {
        queryClient.invalidateQueries({ queryKey: [key] });
      });

      // Per azioni specifiche su singola entità, aggiorna anche la query specifica
      if (action === 'updated' && data?.id) {
        queryClient.invalidateQueries({ queryKey: [entityType, data.id] });
      }
    });

    return () => {
      unsubscribe();
    };
  }, [queryClient]);
}

/**
 * Hook per sottoscriversi a un tipo di entità specifico
 */
export function useEntityUpdates(entityType: string, callback?: (action: string, data: any) => void) {
  const queryClient = useQueryClient();

  useEffect(() => {
    const unsubscribe = signalRService.subscribeToEntity(entityType, (action, data) => {
      // Invalida automaticamente le query
      const queryKeys = entityToQueryKeys[entityType] || [entityType];
      queryKeys.forEach(key => {
        queryClient.invalidateQueries({ queryKey: [key] });
      });

      // Chiama il callback personalizzato se fornito
      callback?.(action, data);
    });

    return () => {
      unsubscribe();
    };
  }, [entityType, queryClient, callback]);
}

/**
 * Funzione helper per notificare cambiamenti dal frontend
 */
export async function notifyDataChange(entityType: string, action: string, data?: any) {
  await signalRService.notifyChange(entityType, action, data);
}
