/**
 * 가상 스크롤링 커스텀 훅
 *
 * @description 대용량 리스트의 렌더링 성능을 최적화하는 가상 스크롤링 훅입니다.
 * 화면에 보이는 항목만 렌더링하여 메모리 사용량과 렌더링 비용을 줄입니다.
 *
 * 주요 기능:
 * - 화면에 보이는 영역만 렌더링 (windowing)
 * - overscan을 통한 부드러운 스크롤 경험
 * - 스크롤 위치 기반 동적 항목 계산
 * - 고정 높이 아이템 지원
 *
 * @module hooks/useVirtualScroll
 */
import React, { useCallback, useMemo, useState, useRef } from 'react';

/**
 * 가상 스크롤링 훅
 *
 * @param {Object} options - 가상 스크롤 설정
 * @param {any[]} options.items - 전체 아이템 배열
 * @param {number} options.itemHeight - 각 아이템의 고정 높이 (px)
 * @param {number} options.containerHeight - 컨테이너 높이 (px)
 * @param {number} [options.overscan=5] - 화면 밖에서 미리 렌더링할 아이템 수
 * @returns {Object} 가상 스크롤 결과 및 핸들러
 *
 * @example
 * const { visibleItems, totalHeight, offsetY, handleScroll } = useVirtualScroll({
 *   items: vessels,
 *   itemHeight: 60,
 *   containerHeight: 400,
 *   overscan: 5
 * });
 */
export const useVirtualScroll = ({
  items,
  itemHeight,
  containerHeight,
  overscan = 5
}) => {
  const [scrollTop, setScrollTop] = useState(0);

  // 가상 스크롤 계산
  const virtualData = useMemo(() => {
    const totalHeight = items.length * itemHeight;

    // 보이는 범위 계산
    const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);
    const endIndex = Math.min(
      items.length - 1,
      Math.ceil((scrollTop + containerHeight) / itemHeight) + overscan
    );

    // 실제 렌더링할 아이템들
    const visibleItems = items.slice(startIndex, endIndex + 1).map((item, index) => ({
      ...item,
      index: startIndex + index
    }));

    // 스크롤 오프셋
    const offsetY = startIndex * itemHeight;

    return {
      totalHeight,
      visibleItems,
      offsetY,
      startIndex,
      endIndex
    };
  }, [items, itemHeight, containerHeight, scrollTop, overscan]);

  // 스크롤 이벤트 핸들러
  const handleScroll = useCallback((event) => {
    setScrollTop(event.currentTarget.scrollTop);
  }, []);

  // Ref 생성
  const containerRef = useRef(null);
  const scrollElementRef = useRef(null);

  return {
    containerRef,
    scrollElementRef,
    handleScroll,
    ...virtualData
  };
};
