
import { useState, useEffect } from 'react';
import { useAuth } from '@/contexts/auth';
import { toast } from '@/hooks/useToast.wrapper';
import { 
  isSyncEnabled, 
  setSyncEnabled,
  setLastSyncTime
} from '@/utils/syncUtils';
import useNotifications from '@/hooks/useNotifications';
import { resetSyncFailureCount } from './syncResultHandler';
import { checkSyncNetworkStatus, showNetworkErrorNotification } from './syncNetworkChecker';
import { performSync } from './syncPerformer';
import { createLocalDataBackup, restoreLocalDataBackup } from './syncBackupUtils';

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

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

    // 초기 호출
    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"
      });
      
      addNotification(
        "로그인 필요", 
        "데이터 동기화를 위해 로그인이 필요합니다."
      );
      return;
    }
    
    try {
      // 네트워크 상태 확인
      if (checked) {
        const isOnline = await checkSyncNetworkStatus();
        if (!isOnline) {
          showNetworkErrorNotification(addNotification);
          return;
        }
      }
      
      // 현재 로컬 데이터 백업
      const dataBackup = createLocalDataBackup();
      
      // 동기화 설정 변경
      setEnabled(checked);
      setSyncEnabled(checked);
      
      // 실패 카운터 초기화
      resetSyncFailureCount();
      
      // 동기화 활성화/비활성화 알림 추가
      addNotification(
        checked ? "동기화 활성화" : "동기화 비활성화", 
        checked 
          ? "데이터가 클라우드와 동기화됩니다." 
          : "클라우드 동기화가 중지되었습니다."
      );
      
      // 이벤트 트리거
      window.dispatchEvent(new Event('auth-state-changed'));
      
      if (checked && user) {
        try {
          // 동기화 수행
          await performSync(user.id);
        } catch (error) {
          console.error('동기화 중 오류, 로컬 데이터 복원 시도:', error);
          
          // 오류 발생 시 백업 데이터 복원
          restoreLocalDataBackup(dataBackup);
          
          toast({
            title: "동기화 오류",
            description: "동기화 중 문제가 발생하여 로컬 데이터가 복원되었습니다.",
            variant: "destructive"
          });
          
          addNotification(
            "동기화 오류", 
            "동기화 중 문제가 발생하여 로컬 데이터가 복원되었습니다."
          );
        }
      }
    } catch (error) {
      console.error('동기화 설정 변경 중 예상치 못한 오류:', error);
      toast({
        title: "동기화 설정 오류",
        description: "설정 변경 중 문제가 발생했습니다. 다시 시도해 주세요.",
        variant: "destructive"
      });
    }
  };

  return { enabled, setEnabled, handleSyncToggle };
};
