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

// Prevent mobile pinch-to-zoom gestures across mobile/tablet browsers (including iOS Safari)
if (typeof window !== 'undefined') {
  // Prevent iOS Safari gesture events (pinch zoom)
  document.addEventListener('gesturestart', (e) => e.preventDefault(), { passive: false });
  document.addEventListener('gesturechange', (e) => e.preventDefault(), { passive: false });
  document.addEventListener('gestureend', (e) => e.preventDefault(), { passive: false });

  const isExtensionError = (err: unknown): boolean => {
    if (!err) return false;
    let str = '';
    try {
      if (typeof err === 'string') {
        str = err;
      } else if (err instanceof Error) {
        str = `${err.name} ${err.message} ${err.stack || ''}`;
      } else if (typeof err === 'object') {
        const obj = err as any;
        str = `${obj.name || ''} ${obj.message || ''} ${obj.reason || ''} ${obj.code || ''} ${obj.stack || ''} ${JSON.stringify(obj)}`;
      } else {
        str = String(err);
      }
    } catch {
      str = String(err);
    }
    const lower = str.toLowerCase();
    return (
      lower.includes('metamask') ||
      lower.includes('ethereum') ||
      lower.includes('failed to connect') ||
      lower.includes('inpage.js') ||
      lower.includes('chrome-extension') ||
      lower.includes('moz-extension') ||
      lower.includes('wallet') ||
      lower.includes('web3') ||
      lower.includes("reading 'emit'") ||
      lower.includes("reading 'addlistener'") ||
      lower.includes("cannot read properties of undefined (reading 'emit')") ||
      lower.includes("cannot read properties of undefined (reading 'addlistener')") ||
      (lower.includes('cannot read properties of undefined') && (lower.includes('emit') || lower.includes('addlistener') || lower.includes('connect')))
    );
  };

  // Override console methods to suppress injected browser extension noise (e.g. MetaMask inpage scripts)
  const origError = console.error;
  console.error = (...args: unknown[]) => {
    if (args.some(arg => isExtensionError(arg))) return;
    const combinedMsg = args.map(a => {
      if (typeof a === 'string') return a;
      if (a instanceof Error) return `${a.name}: ${a.message}\n${a.stack}`;
      try { return JSON.stringify(a); } catch { return String(a || ''); }
    }).join(' ');
    if (isExtensionError(combinedMsg)) return;
    origError.apply(console, args);
  };

  const origWarn = console.warn;
  console.warn = (...args: unknown[]) => {
    if (args.some(arg => isExtensionError(arg))) return;
    const combinedMsg = args.map(a => {
      if (typeof a === 'string') return a;
      if (a instanceof Error) return `${a.name}: ${a.message}\n${a.stack}`;
      try { return JSON.stringify(a); } catch { return String(a || ''); }
    }).join(' ');
    if (isExtensionError(combinedMsg)) return;
    origWarn.apply(console, args);
  };

  // Suppress third-party browser extension console noise and uncaught errors
  window.addEventListener('error', (event) => {
    const errorObj = event?.error || event?.message || event;
    const filename = event?.filename || '';
    if (isExtensionError(errorObj) || isExtensionError(filename) || isExtensionError(event?.message)) {
      event.preventDefault();
      event.stopImmediatePropagation();
      return true;
    }
  }, true);

  window.onerror = (message, source, lineno, colno, error) => {
    if (isExtensionError(message) || isExtensionError(source) || isExtensionError(error)) {
      return true;
    }
  };

  window.addEventListener('unhandledrejection', (event) => {
    const reason = event?.reason;
    if (isExtensionError(reason) || isExtensionError(reason?.message) || isExtensionError(String(reason || ''))) {
      event.preventDefault();
      event.stopImmediatePropagation();
    }
  }, true);

  window.onunhandledrejection = (event: PromiseRejectionEvent) => {
    const reason = event?.reason;
    if (isExtensionError(reason) || isExtensionError(reason?.message) || isExtensionError(String(reason || ''))) {
      event.preventDefault();
      return true;
    }
  };
}

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