
import { useEffect } from 'react';

/**
 * 앱이 포커스를 얻었을 때나 가시성이 변경될 때 데이터를 새로고침하는 커스텀 훅
 */
export const useAppFocusEvents = () => {
  useEffect(() => {
    const handleFocus = () => {
      try {
        console.log('창이 포커스를 얻음 - 데이터 새로고침');
        // 이미 리프레시 중인지 확인하는 플래그
        if (sessionStorage.getItem('isRefreshing') === 'true') {
          console.log('이미 리프레시 진행 중, 중복 실행 방지');
          return;
        }
        
        try {
          sessionStorage.setItem('isRefreshing', 'true');
          
          // 이벤트 발생시켜 데이터 새로고침
          window.dispatchEvent(new Event('storage'));
          window.dispatchEvent(new Event('transactionUpdated'));
          window.dispatchEvent(new Event('budgetDataUpdated'));
          window.dispatchEvent(new Event('categoryBudgetsUpdated'));
          
          // 리프레시 완료 표시 (300ms 후에 플래그 해제)
          setTimeout(() => {
            sessionStorage.setItem('isRefreshing', 'false');
          }, 300);
        } catch (e) {
          console.error('이벤트 발생 오류:', e);
          sessionStorage.setItem('isRefreshing', 'false');
        }
      } catch (error) {
        console.error('포커스 이벤트 처리 중 오류:', error);
      }
    };

    // 포커스 이벤트
    window.addEventListener('focus', handleFocus);
    
    // 가시성 변경 이벤트 (백그라운드에서 전경으로 돌아올 때)
    const handleVisibilityChange = () => {
      try {
        if (document.visibilityState === 'visible') {
          console.log('페이지가 다시 보임 - 데이터 새로고침');
          handleFocus();
        }
      } catch (error) {
        console.error('가시성 이벤트 처리 중 오류:', error);
      }
    };
    
    document.addEventListener('visibilitychange', handleVisibilityChange);
    
    // 정기적인 데이터 새로고침 (60초마다로 변경 - 너무 빈번한 리프레시 방지)
    const refreshInterval = setInterval(() => {
      try {
        if (document.visibilityState === 'visible' && 
            sessionStorage.getItem('isRefreshing') !== 'true') {
          console.log('정기 새로고침 - 데이터 업데이트');
          handleFocus();
        }
      } catch (error) {
        console.error('정기 새로고침 처리 중 오류:', error);
      }
    }, 60000);  // 60초마다
    
    return () => {
      window.removeEventListener('focus', handleFocus);
      document.removeEventListener('visibilitychange', handleVisibilityChange);
      clearInterval(refreshInterval);
    };
  }, []);
};
