import { cadastrarNotificacao } from "@/requests/CRUD/Notificacoes/cadastrarNotificacao";
import { useRealtimeChannel } from "@/hooks/useRealtimeChannel";
import {
  Dispatch,
  ReactNode,
  SetStateAction,
  createContext,
  useContext,
  useState,
} from "react";

interface IProviderProps {
  children: ReactNode;
}

export interface Notification {
  id: string;
  id_notificacao: string;
  data_hora_criacao: string;
  data_hora_criacao_formatada?: string;
  tipo_notificacao: string;
  titulo_notificacao: string;
  conteudo_notificacao: string;
  id_usuario_notificado: string;
  status_notificacao: string;
  id_cliente?: string | number;
  id_negocio?: string | number;
  nome_cliente?: string;
  nome_negocio_coleta?: string;
  urgencia_agendamento?: string | number;
  tipo_agendamento?: string | number;
  id_usuario_movimento?: string | number;
  nome_usuario_movimento?: string;
  id_automatizacao_notificacao?: string | number;
  // Origem das notificações geradas por uma Notificação de Etapa (item 06)
  nome_fluxo_notificacao?: string;
  nome_etapa_notificacao?: string;
  // Fluxo/Etapa de onde o card saiu na movimentação que gerou a notificação
  nome_fluxo_saida_notificacao?: string;
  nome_etapa_saida_notificacao?: string;
}

export interface INewNotification {
  tipo_notificacao: string;
  titulo_notificacao: string;
  conteudo_notificacao: string;
  target?: {
    usuarios?: string[];
    perfis?: string[];
    coleta?: string;
  };
}

interface ISocketProviderData {
  notificar: (data: INewNotification) => void;
  notifications: any[];
  atualizarNotificacoes: () => void;
  notificarNotificacao: () => void;
  setNotifications: Dispatch<SetStateAction<Notification[]>>;
}

const SocketContext = createContext({} as ISocketProviderData);

export const SocketProvider = ({ children }: IProviderProps) => {
  const [notifications, setNotifications] = useState<Notification[]>([]);
  const { publish } = useRealtimeChannel("notifications");

  function atualizarNotificacoes() {
    publish({ action: "refresh", resource: "notification" });
  }

  async function notificar(data: INewNotification) {
    await cadastrarNotificacao(data);
    publish({ action: "create", resource: "notification", data });
  }

  function notificarNotificacao() {
    publish({ action: "refresh", resource: "notification" });
  }

  return (
    <SocketContext.Provider
      value={{
        notificar,
        notifications,
        atualizarNotificacoes,
        notificarNotificacao,
        setNotifications,
      }}
    >
      {children}
    </SocketContext.Provider>
  );
};

export const useSocketContext = () => {
  return useContext(SocketContext);
};
