import {StrictMode} from 'react';
import {createRoot} from 'react-dom/client';
import App from './App.tsx';
import './index.css';

// Suppress generic cross-origin "Script error." triggered by browser iframe sandbox
// security rules when WebAssembly/WebWorkers are loaded.
if (typeof window !== 'undefined') {
  // Intercept and suppress console.error for cross-origin "Script error" messages
  let currentConsoleError = console.error;
  Object.defineProperty(console, 'error', {
    get() {
      return function (...args: any[]) {
        const isScriptError = args.some(arg => {
          if (!arg) return false;
          const str = String(arg.message || arg.stack || arg);
          return str.toLowerCase().includes('script error');
        });
        if (isScriptError) {
          // Print as console.debug or silent log so developer/user console is clean
          console.debug('Quietly suppressed cross-origin "Script error." in console.error');
          return;
        }
        currentConsoleError.apply(console, args);
      };
    },
    set(fn) {
      currentConsoleError = fn;
    },
    configurable: true
  });

  // 1. Direct window.onerror override returning true completely suppresses the error from bubbling up to the parent iframe/host.
  let currentOnerror = null;
  Object.defineProperty(window, 'onerror', {
    get() {
      return function (message, source, lineno, colno, error) {
        const msgStr = String(message || '');
        if (msgStr.toLowerCase().includes('script error') || !source) {
          console.warn('Suppressed sandboxed iframe "Script error." via window.onerror');
          return true; // This prevents the error from bubbling up to parent window/AI Studio console
        }
        if (currentOnerror) {
          return currentOnerror(message, source, lineno, colno, error);
        }
        return false;
      };
    },
    set(fn) {
      currentOnerror = fn;
    },
    configurable: true
  });

  // 2. Event listener with stopImmediatePropagation to ensure other handlers on window don't see it
  window.addEventListener('error', (event) => {
    const msg = String(event.message || '');
    if (msg.toLowerCase().includes('script error') || !event.filename) {
      event.preventDefault();
      event.stopImmediatePropagation();
    }
  }, true); // Use capture phase to intercept early

  window.addEventListener('unhandledrejection', (event) => {
    const reason = event.reason;
    if (reason && (String(reason).toLowerCase().includes('script error') || String(reason).toLowerCase().includes('failed to import'))) {
      event.preventDefault();
      event.stopImmediatePropagation();
    }
  }, true);

  // Safe HTMLMediaElement currentTime setting to prevent NaN/Infinity crashes
  try {
    const originalCurrentTimeDescriptor = Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, 'currentTime');
    if (originalCurrentTimeDescriptor && originalCurrentTimeDescriptor.set) {
      Object.defineProperty(HTMLMediaElement.prototype, 'currentTime', {
        get() {
          return originalCurrentTimeDescriptor.get.call(this);
        },
        set(value) {
          const numValue = Number(value);
          if (isNaN(numValue) || !isFinite(numValue)) {
            console.warn('Suppressed setting invalid currentTime on HTMLMediaElement:', value);
            return;
          }
          try {
            originalCurrentTimeDescriptor.set.call(this, numValue);
          } catch (err) {
            console.warn('Failed to set HTMLMediaElement.currentTime:', err);
          }
        },
        configurable: true
      });
    }
  } catch (e) {
    console.warn('Failed to patch HTMLMediaElement.prototype.currentTime:', e);
  }
}

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <App />
  </StrictMode>,
);
