import { useEffect } from 'react';
import { useQueryClient } from '@tanstack/react-query';
import { selectUserDepartments, useAuthStore } from '@/features/auth/store/authStore';
import { dashboardQueryKeys } from '@/features/dashboard/constants/queryKeys';
import { getEcho, isRealtimeEnabled, leaveChannel } from '@/shared/realtime/echoClient';
import { realtimeChannels, realtimeEvents } from '@/shared/realtime/realtimeChannels';

export function useDashboardRealtime(): void {
  const departments = useAuthStore(selectUserDepartments);
  const queryClient = useQueryClient();

  useEffect(() => {
    const echo = getEcho();
    if (!isRealtimeEnabled() || !echo || departments.length === 0) {
      return undefined;
    }

    const departmentIds = departments.map((department) => department.id);
    const channels = departmentIds.map((departmentId) => {
      const channelName = realtimeChannels.departmentTickets(departmentId);
      const channel = echo.private(channelName);

      const refresh = () => {
        void queryClient.invalidateQueries({ queryKey: dashboardQueryKeys.overview });
        void queryClient.invalidateQueries({ queryKey: dashboardQueryKeys.ticketTrends });
        void queryClient.invalidateQueries({ queryKey: dashboardQueryKeys.assigneePerformance });
        void queryClient.invalidateQueries({ queryKey: ['tickets', 'list'] });
      };

      channel.listen(realtimeEvents.dashboardRefresh, refresh);
      channel.listen(realtimeEvents.ticketStatusChanged, refresh);
      channel.listen(realtimeEvents.ticketAssigned, refresh);

      return { channelName, channel };
    });

    return () => {
      for (const { channelName, channel } of channels) {
        channel.stopListening(realtimeEvents.dashboardRefresh);
        channel.stopListening(realtimeEvents.ticketStatusChanged);
        channel.stopListening(realtimeEvents.ticketAssigned);
        leaveChannel(channelName);
      }
    };
  }, [departments, queryClient]);
}
