
import { useState, useEffect } from 'react';
import { useAuth } from '@/contexts/auth';
import { toast } from '@/hooks/useToast.wrapper';
import { 
  isSyncEnabled, 
  setSyncEnabled 
} from '@/utils/syncUtils';
import { trySyncAllData } from '@/utils/syncUtils';

/**
 * 동기화 토글 기능을 위한 커스텀 훅
 */
export const useSyncToggle = () => {
  const [enabled, setEnabled] = useState(isSyncEnabled());
  const { user } = useAuth();

  // 사용자 로그인 상태 변경 감지
  useEffect(() => {
    // 사용자 로그인 상태에 따라 동기화 설정 업데이트
    const updateSyncState = () => {
      if (!user && isSyncEnabled()) {
        // 사용자가 로그아웃했고 동기화가 활성화되어 있으면 비활성화
        setSyncEnabled(false);
        setEnabled(false);
        console.log('로그아웃으로 인해 동기화 설정이 비활성화되었습니다.');
      }
      
      // 동기화 상태 업데이트
      setEnabled(isSyncEnabled());
    };

    // 초기 호출
    updateSyncState();
    
    // 인증 상태 변경 이벤트 리스너
    window.addEventListener('auth-state-changed', updateSyncState);
    
    // 스토리지 변경 이벤트에도 동기화 상태 확인 추가
    const handleStorageChange = (event: StorageEvent) => {
      if (event.key === 'syncEnabled' || event.key === null) {
        setEnabled(isSyncEnabled());
        console.log('스토리지 변경으로 동기화 상태 업데이트:', isSyncEnabled() ? '활성화' : '비활성화');
      }
    };
    
    window.addEventListener('storage', handleStorageChange);
    
    return () => {
      window.removeEventListener('auth-state-changed', updateSyncState);
      window.removeEventListener('storage', handleStorageChange);
    };
  }, [user]);

  // 동기화 토글 핸들러
  const handleSyncToggle = async (checked: boolean) => {
    if (!user && checked) {
      toast({
        title: "로그인 필요",
        description: "데이터 동기화를 위해 로그인이 필요합니다.",
        variant: "destructive"
      });
      return;
    }
    
    // 현재 로컬 데이터 백업
    const budgetDataBackup = localStorage.getItem('budgetData');
    const categoryBudgetsBackup = localStorage.getItem('categoryBudgets');
    const transactionsBackup = localStorage.getItem('transactions');
    
    console.log('동기화 설정 변경 전 로컬 데이터 백업:', {
      budgetData: budgetDataBackup ? '있음' : '없음',
      categoryBudgets: categoryBudgetsBackup ? '있음' : '없음',
      transactions: transactionsBackup ? '있음' : '없음'
    });
    
    setEnabled(checked);
    setSyncEnabled(checked);
    
    // 이벤트 트리거
    window.dispatchEvent(new Event('auth-state-changed'));
    
    if (checked && user) {
      try {
        // 동기화 활성화 시 즉시 동기화 실행
        await performSync(user.id);
      } catch (error) {
        console.error('동기화 중 오류, 로컬 데이터 복원 시도:', error);
        
        // 오류 발생 시 백업 데이터 복원
        if (budgetDataBackup) {
          localStorage.setItem('budgetData', budgetDataBackup);
        }
        if (categoryBudgetsBackup) {
          localStorage.setItem('categoryBudgets', categoryBudgetsBackup);
        }
        if (transactionsBackup) {
          localStorage.setItem('transactions', transactionsBackup);
        }
        
        // 이벤트 발생시켜 UI 업데이트
        window.dispatchEvent(new Event('budgetDataUpdated'));
        window.dispatchEvent(new Event('categoryBudgetsUpdated'));
        window.dispatchEvent(new Event('transactionUpdated'));
        
        toast({
          title: "동기화 오류",
          description: "동기화 중 문제가 발생하여 로컬 데이터가 복원되었습니다.",
          variant: "destructive"
        });
      }
    }
  };

  return { enabled, setEnabled, handleSyncToggle };
};

// 실제 동기화 수행 함수
const performSync = async (userId: string) => {
  if (!userId) return;
  
  try {
    // 안전한 동기화 함수 사용
    const result = await trySyncAllData(userId);
    return result;
  } catch (error) {
    console.error('동기화 오류:', error);
    throw error;
  }
};
