'use client';

import { createContext, useContext, useEffect, useState, useCallback, ReactNode } from 'react';
import { usePathname } from 'next/navigation';
import { useAuth } from './AuthContext';
import { useSocket, SOCKET_EVENTS } from './SocketContext';
import { api } from '@/lib/api';

interface MessagesContextType {
  unreadCount: number;
  refreshUnreadCount: () => Promise<void>;
}

const MessagesContext = createContext<MessagesContextType | undefined>(undefined);

export function MessagesProvider({ children }: { children: ReactNode }) {
  const { user } = useAuth();
  const { socket } = useSocket();
  const pathname = usePathname();
  const [unreadCount, setUnreadCount] = useState(0);

  const refreshUnreadCount = useCallback(async () => {
    if (!user) {
      setUnreadCount(0);
      return;
    }
    try {
      const res = await api<{ data: { count: number } }>('/messages/unread-count');
      setUnreadCount(res.data.count);
    } catch {
      setUnreadCount(0);
    }
  }, [user]);

  useEffect(() => {
    refreshUnreadCount();
  }, [refreshUnreadCount]);

  useEffect(() => {
    const onFocus = () => refreshUnreadCount();
    window.addEventListener('focus', onFocus);
    return () => window.removeEventListener('focus', onFocus);
  }, [refreshUnreadCount]);

  useEffect(() => {
    if (!socket || !user) return;

    const onMessage = (msg: { senderId: string; conversationId?: string }) => {
      if (msg.senderId === user.id) return;
      const convId = msg.conversationId;
      if (convId && pathname.includes(`/messages/${convId}`)) return;
      setUnreadCount((c) => c + 1);
    };

    socket.on(SOCKET_EVENTS.RECEIVE_MESSAGE, onMessage);
    return () => {
      socket.off(SOCKET_EVENTS.RECEIVE_MESSAGE, onMessage);
    };
  }, [socket, user, pathname]);

  return (
    <MessagesContext.Provider value={{ unreadCount, refreshUnreadCount }}>
      {children}
    </MessagesContext.Provider>
  );
}

export function useMessages() {
  const context = useContext(MessagesContext);
  if (!context) throw new Error('useMessages must be used within MessagesProvider');
  return context;
}
