import { debounce } from 'lodash';
import { useEffect, useRef, useState } from 'react';

/**
 * 用于追踪 DOM 元素尺寸的 hook。
 *
 * @param initialWidth - 初始宽度。
 * @param initialHeight - 初始高度。
 * @param deps - 依赖列表。
 * @return 一个元组，包含 DOM 元素的 ref、当前宽度和当前高度。
 */
export function useDomSize<T extends HTMLElement>(
  initialWidth: number,
  initialHeight: number,
  deps: React.DependencyList = [],
) {
  const domRef = useRef<T>(null);
  const [width, setWidth] = useState(initialWidth);
  const [height, setHeight] = useState(initialHeight);

  useEffect(() => {
    const setDomHeight = () => {
      if (domRef.current) {
        setHeight(domRef.current.offsetHeight);
        setWidth(domRef.current.offsetWidth);
      }
    };
    const debounceFunc = debounce(setDomHeight, 100);

    setDomHeight();
    window.addEventListener('resize', debounceFunc);

    return () => {
      window.removeEventListener('resize', debounceFunc);
    };
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, deps);

  return [domRef, { width, height }] as const;
}
