import { useEffect } from 'react';
import { useQueryClient } from '@tanstack/react-query';
import toast from 'react-hot-toast';
import { useLocale } from '@/app/providers/LocaleProvider';
import { ticketQueryKey } from '@/features/tickets/hooks/useTicket';
import { ticketCollaboratorsQueryKey } from '@/features/tickets/hooks/useTicketCollaborators';
import { ticketRepliesQueryKey } from '@/features/tickets/hooks/useTicketReplies';
import { ticketNotesQueryKey } from '@/features/tickets/hooks/useTicketNotes';
import { ticketSlaQueryKey } from '@/features/tickets/hooks/useTicketSla';
import { getEcho, isRealtimeEnabled, leaveChannel } from '@/shared/realtime/echoClient';
import { realtimeChannels, realtimeEvents } from '@/shared/realtime/realtimeChannels';

export function useTicketRealtime(ticketId: string | undefined, options?: { subscribeNotes?: boolean }): void {
  const queryClient = useQueryClient();
  const { t } = useLocale();
  const subscribeNotes = options?.subscribeNotes ?? true;

  useEffect(() => {
    const echo = getEcho();
    if (!isRealtimeEnabled() || !echo || !ticketId) {
      return undefined;
    }

    const ticketChannelName = realtimeChannels.ticket(ticketId);
    const ticketChannel = echo.private(ticketChannelName);

    const invalidateTicket = () => {
      void queryClient.invalidateQueries({ queryKey: ticketQueryKey(ticketId) });
      void queryClient.invalidateQueries({ queryKey: ticketSlaQueryKey(ticketId) });
    };

    const onStatusChanged = () => {
      invalidateTicket();
      toast(t('realtime:ticket.statusChanged'), { icon: '🔄' });
    };

    const onAssigned = () => {
      invalidateTicket();
      toast(t('realtime:ticket.assigned'), { icon: '👤' });
    };

    const onCollaboratorChanged = () => {
      invalidateTicket();
      void queryClient.invalidateQueries({ queryKey: ticketCollaboratorsQueryKey(ticketId) });
      toast(t('realtime:ticket.collaboratorsUpdated'), { icon: '👥' });
    };

    const onReplyAdded = () => {
      void queryClient.invalidateQueries({ queryKey: ticketRepliesQueryKey(ticketId) });
      invalidateTicket();
      toast(t('realtime:ticket.replyAdded'), { icon: '💬' });
    };

    ticketChannel.listen(realtimeEvents.ticketStatusChanged, onStatusChanged);
    ticketChannel.listen(realtimeEvents.ticketAssigned, onAssigned);
    ticketChannel.listen(realtimeEvents.ticketCollaboratorAdded, onCollaboratorChanged);
    ticketChannel.listen(realtimeEvents.ticketCollaboratorRemoved, onCollaboratorChanged);
    ticketChannel.listen(realtimeEvents.replyAdded, onReplyAdded);

    let notesChannel: ReturnType<typeof echo.private> | null = null;
    let notesChannelName: string | null = null;

    if (subscribeNotes) {
      notesChannelName = realtimeChannels.ticketNotes(ticketId);
      notesChannel = echo.private(notesChannelName);
      notesChannel.listen(realtimeEvents.noteAdded, () => {
        void queryClient.invalidateQueries({ queryKey: ticketNotesQueryKey(ticketId) });
        toast(t('realtime:ticket.noteAdded'), { icon: '📝' });
      });
    }

    return () => {
      ticketChannel.stopListening(realtimeEvents.ticketStatusChanged);
      ticketChannel.stopListening(realtimeEvents.ticketAssigned);
      ticketChannel.stopListening(realtimeEvents.ticketCollaboratorAdded);
      ticketChannel.stopListening(realtimeEvents.ticketCollaboratorRemoved);
      ticketChannel.stopListening(realtimeEvents.replyAdded);
      leaveChannel(ticketChannelName);

      if (notesChannel && notesChannelName) {
        notesChannel.stopListening(realtimeEvents.noteAdded);
        leaveChannel(notesChannelName);
      }
    };
  }, [queryClient, subscribeNotes, t, ticketId]);
}
