import { useCallback, useRef } from 'react';
import { dataGridRowClassnames } from '../../Row/constants';
/**
 * Хук для синхронизации hover-состояния строк DataGrid через прямую работу с DOM.
 */
export const useRowHover = ({ hasPinnedColumns = false, }) => {
    const rowsMapRef = useRef(new Map());
    const hoveredRowIdRef = useRef(null);
    const highlight = useCallback((rowId) => {
        if (!hasPinnedColumns) {
            return;
        }
        const elements = rowsMapRef.current.get(rowId);
        if (!elements) {
            return;
        }
        elements.forEach((el) => {
            if (!el.classList.contains(dataGridRowClassnames.hover)) {
                el.classList.add(dataGridRowClassnames.hover);
            }
        });
    }, [hasPinnedColumns]);
    const unhighlight = useCallback((rowId) => {
        if (!hasPinnedColumns) {
            return;
        }
        const elements = rowsMapRef.current.get(rowId);
        if (!elements) {
            return;
        }
        elements.forEach((el) => el.classList.remove(dataGridRowClassnames.hover));
        return;
    }, [hasPinnedColumns]);
    const registerRowElement = useCallback((rowId, el) => {
        if (!hasPinnedColumns) {
            return;
        }
        const map = rowsMapRef.current;
        if (!map.has(rowId)) {
            map.set(rowId, new Set());
        }
        map.get(rowId).add(el);
    }, [hasPinnedColumns]);
    const unregisterRowElement = useCallback((rowId, el) => {
        if (!hasPinnedColumns) {
            return;
        }
        const map = rowsMapRef.current;
        const set = map.get(rowId);
        if (!set) {
            return;
        }
        set.delete(el);
        if (set.size === 0) {
            map.delete(rowId);
        }
    }, [hasPinnedColumns]);
    const onRowEnter = useCallback((rowId) => {
        if (!hasPinnedColumns) {
            return;
        }
        if (hoveredRowIdRef.current === rowId) {
            return;
        }
        if (hoveredRowIdRef.current) {
            unhighlight(hoveredRowIdRef.current);
        }
        highlight(rowId);
        hoveredRowIdRef.current = rowId;
    }, [hasPinnedColumns, highlight, unhighlight]);
    /**
     * Обрабатывает уход курсора со строки.
     * Убирает hover, если курсор действительно покинул строку.
     */
    const onRowLeave = useCallback((rowId, e) => {
        if (!hasPinnedColumns) {
            return;
        }
        const next = e.relatedTarget;
        if (next?.closest(`[data-row-id="${rowId}"]`)) {
            return;
        }
        unhighlight(rowId);
        hoveredRowIdRef.current = null;
    }, [hasPinnedColumns, unhighlight]);
    return {
        rowsMapRef,
        registerRowElement,
        unregisterRowElement,
        onRowEnter,
        onRowLeave,
    };
};
