import { createRoot } from "react-dom/client";
import App from "./App.tsx";
import "./index.css";
import { initializeGlobalErrorHandler } from "./lib/globalErrorHandler";
import { applyCSP, preventClickjacking, hardenConsole } from "./lib/csp";
import { initializePerformanceTracking } from "./lib/performanceTracker";

interface BadgeNavigator extends Navigator {
  setAppBadge?: (contents?: number) => Promise<void>;
  clearAppBadge?: () => Promise<void>;
}

// Initialize security measures FIRST
initializeGlobalErrorHandler();
applyCSP();
preventClickjacking();
hardenConsole();
initializePerformanceTracking();

// Detect iframe/preview environments where SW must NOT run
const isInIframe = (() => {
  try {
    return window.self !== window.top;
  } catch {
    return true;
  }
})();

const isPreviewHost =
  window.location.hostname.includes("id-preview--") ||
  window.location.hostname.includes("lovableproject.com") ||
  window.location.hostname.includes("lovable.app");

if (isPreviewHost || isInIframe) {
  // Unregister any existing service workers in preview/iframe contexts
  navigator.serviceWorker?.getRegistrations().then((registrations) => {
    registrations.forEach((r) => r.unregister());
  });
} else if ('serviceWorker' in navigator) {
  // Production-only SW registration
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/sw.js', { scope: '/' })
      .then((registration) => {
        console.log('✅ Service Worker registered');

        // Check for updates every hour
        const updateInterval = setInterval(() => {
          registration.update().catch(() => {});
        }, 60 * 60 * 1000);

        window.addEventListener('beforeunload', () => clearInterval(updateInterval));

        // Listen for updates
        registration.addEventListener('updatefound', () => {
          const newWorker = registration.installing;
          if (newWorker) {
            newWorker.addEventListener('statechange', () => {
              if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
                console.log('🔄 New version available');
                window.dispatchEvent(new CustomEvent('swUpdateAvailable'));
              }
            });
          }
        });

        // Handle messages from service worker
        navigator.serviceWorker.addEventListener('message', (event) => {
          if (event.data?.type === 'SKIP_WAITING') {
            console.log('🔄 Activating new service worker...');
          } else if (event.data?.type === 'UPDATE_BADGE') {
            const count = event.data.count || 0;
            const badgeNavigator = navigator as BadgeNavigator;
            if (badgeNavigator.setAppBadge && badgeNavigator.clearAppBadge) {
              if (count > 0) {
                badgeNavigator.setAppBadge(count).catch(() => {});
              } else {
                badgeNavigator.clearAppBadge().catch(() => {});
              }
            }
          } else if (event.data?.type === 'SYNC_COMPLETE') {
            console.log(`✅ Sync complete: ${event.data.count} actions synced`);
          }
        });
      })
      .catch((error) => {
        console.log('ℹ️ PWA features not available:', error.message);
      });
  });

  // Online/offline events
  window.addEventListener('online', () => {
    window.dispatchEvent(new CustomEvent('networkStatusChange', { detail: { online: true } }));
  });

  window.addEventListener('offline', () => {
    window.dispatchEvent(new CustomEvent('networkStatusChange', { detail: { online: false } }));
  });
}

// Handle app installation
let deferredPrompt: BeforeInstallPromptEvent | null = null;

interface BeforeInstallPromptEvent extends Event {
  prompt(): Promise<void>;
  userChoice: Promise<{ outcome: 'accepted' | 'dismissed' }>;
}

window.addEventListener('beforeinstallprompt', (e: Event) => {
  e.preventDefault();
  deferredPrompt = e as BeforeInstallPromptEvent;
});

window.addEventListener('appinstalled', () => {
  deferredPrompt = null;
});

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