import { useRef, useCallback } from 'react';
import { ISeriesApi, Time } from 'lightweight-charts';

interface CandleUpdate {
  timestamp: number;
  open: number;
  high: number;
  low: number;
  close: number;
  volume?: number;
}

/**
 * 차트 증분 업데이트 Hook
 * 전체 재렌더링 없이 새 캔들만 추가
 */
export const useIncrementalChartUpdate = () => {
  const lastUpdateTimeRef = useRef<number>(0);
  
  /**
   * 캔들 시리즈에 새 데이터 추가 (증분 업데이트)
   * 
   * @param candleSeries lightweight-charts 캔들 시리즈
   * @param newCandle 새 캔들 데이터
   * @returns 업데이트 성공 여부
   */
  const updateCandle = useCallback((
    candleSeries: ISeriesApi<'Candlestick'> | null,
    newCandle: CandleUpdate
  ): boolean => {
    if (!candleSeries) {
      console.warn('[Incremental Update] Candle series not available');
      return false;
    }
    
    try {
      // 중복 업데이트 방지
      if (newCandle.timestamp <= lastUpdateTimeRef.current) {
        console.debug('[Incremental Update] Skipping duplicate/old candle');
        return false;
      }
      
      // 타임스탬프를 초 단위로 변환 (lightweight-charts 형식)
      const time = Math.floor(newCandle.timestamp / 1000) as Time;
      
      // 증분 업데이트 (전체 재렌더링 X)
      candleSeries.update({
        time,
        open: newCandle.open,
        high: newCandle.high,
        low: newCandle.low,
        close: newCandle.close,
      });
      
      lastUpdateTimeRef.current = newCandle.timestamp;
      console.log(`✅ [Incremental Update] Candle updated: ${time} @ ${newCandle.close}`);
      
      return true;
      
    } catch (error) {
      console.error('[Incremental Update] Error updating candle:', error);
      return false;
    }
  }, []);
  
  /**
   * 라인 시리즈 증분 업데이트 (이동평균선 등)
   */
  const updateLine = useCallback((
    lineSeries: ISeriesApi<'Line'> | null,
    timestamp: number,
    value: number
  ): boolean => {
    if (!lineSeries) {
      return false;
    }
    
    try {
      const time = Math.floor(timestamp / 1000) as Time;
      
      lineSeries.update({
        time,
        value
      });
      
      return true;
      
    } catch (error) {
      console.error('[Incremental Update] Error updating line:', error);
      return false;
    }
  }, []);
  
  /**
   * 마지막 업데이트 시간 초기화
   */
  const reset = useCallback(() => {
    lastUpdateTimeRef.current = 0;
  }, []);
  
  return {
    updateCandle,
    updateLine,
    reset
  };
};
