import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App.tsx";
import "./styles/index.css";
import "./styles/theme.css";
import "./styles/style.css";
import "./styles/style-calendar.css";
import { dbManager } from "./utils/indexedDB";
import { networkListener, checkNetworkStatus } from "./utils/offlineManager";
import { syncService } from "./services/syncService";
import { store } from "./store/index";
import { setOfflineMode, setPendingSyncCount } from "./store/slices/notesSlice";
import { addNotification } from "./store/slices/uiSlice";

// Регистрация PWA (vite-plugin-pwa автоматически внедряет регистрацию через injectRegister: "auto")

// Инициализация offline функционала
async function initOfflineMode() {
  try {
    console.log('[Init] Initializing offline mode...');
    
    // Инициализация IndexedDB
    await dbManager.init();
    console.log('[Init] IndexedDB initialized');

    // Проверка состояния сети
    // Сначала проверяем navigator.onLine для быстрой проверки
    let isOnline: boolean = navigator.onLine;
    
    // Если navigator.onLine = false, точно оффлайн (не нужно делать fetch)
    if (!navigator.onLine) {
      isOnline = false;
    } else {
      // Если navigator.onLine = true, делаем дополнительную проверку через fetch
      try {
        isOnline = await checkNetworkStatus();
      } catch (error) {
        // Если проверка сети упала с ошибкой, скорее всего мы оффлайн
        console.warn('[Init] Network status check failed, assuming offline:', error);
        isOnline = false;
      }
    }
    
    // Финальная проверка: если navigator.onLine = false, точно оффлайн
    // Это важно, так как navigator.onLine может обновиться во время проверки
    if (!navigator.onLine) {
      isOnline = false;
    }
    
    store.dispatch(setOfflineMode(!isOnline));
    console.log(`[Init] Network status: ${isOnline ? 'online' : 'offline'}`);

    // Установка listeners для событий сети
    networkListener.onOnline(async () => {
      console.log('[Network] Online event detected');
      const isOnline = await checkNetworkStatus();
      store.dispatch(setOfflineMode(!isOnline));
      
      if (isOnline) {
        store.dispatch(
          addNotification({
            message: 'Подключение восстановлено, начинаем синхронизацию...',
            type: 'info',
          })
        );
        
        // Запуск синхронизации
        await syncService.startSync();
      }
    });

    networkListener.onOffline(() => {
      console.log('[Network] Offline event detected');
      store.dispatch(setOfflineMode(true));
      store.dispatch(
        addNotification({
          message: 'Работаем в offline режиме',
          type: 'warning',
        })
      );
    });

    // Обновление счетчика ожидающих синхронизацию
    const pendingCount = await dbManager.getPendingSyncCount();
    store.dispatch(setPendingSyncCount(pendingCount));
    
    if (pendingCount > 0) {
      console.log(`[Init] Found ${pendingCount} pending sync items`);
    }

    // Автоматическая синхронизация при старте если есть что синхронизировать
    if (isOnline && pendingCount > 0) {
      console.log('[Init] Starting initial sync...');
      // Небольшая задержка для инициализации UI
      setTimeout(() => {
        syncService.startSync();
      }, 2000);
    }

    console.log('[Init] Offline mode initialized successfully');
  } catch (error) {
    console.error('[Init] Error initializing offline mode:', error);
  }
}

// Запуск инициализации
initOfflineMode();

ReactDOM.createRoot(document.getElementById("root")!).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);
