import { useEffect, useRef } from 'react';
import { io } from 'socket.io-client';

let socketInstance = null;

export function getSocket() {
    if (!socketInstance) {
        socketInstance = io(import.meta.env.VITE_API_URL || 'http://localhost:3000', {
            withCredentials: true,
            transports: ['websocket', 'polling'],
        });
    }
    return socketInstance;
}

/**
 * Hook để kết nối socket và đăng ký lắng nghe sự kiện
 * @param {string|null} userId - userId của người dùng đang đăng nhập
 * @param {Object} listeners - { eventName: handlerFn }
 */
export function useSocket(userId, listeners = {}) {
    const listenersRef = useRef(listeners);
    listenersRef.current = listeners;

    useEffect(() => {
        const socket = getSocket();

        // Đăng nhập userId để server biết gửi thông báo cho ai
        if (userId) {
            socket.emit('join', userId);
        }

        // Đăng ký các listener
        const eventHandlers = {};
        Object.entries(listenersRef.current).forEach(([event, handler]) => {
            eventHandlers[event] = handler;
            socket.on(event, handler);
        });

        return () => {
            // Gỡ listener khi unmount
            Object.entries(eventHandlers).forEach(([event, handler]) => {
                socket.off(event, handler);
            });
        };
    }, [userId]);
}
