"use client";

import { useEffect, type ReactNode } from "react";
import ReactGA from "react-ga4";

interface MetricsProviderProps {
  children: ReactNode;
  googleAnalyticsId?: string;
  yandexMetrikaId?: string;
  facebookPixels?: string[];
}

/**
 * Metrics Provider Component
 * 
 * Инициализирует все метрики СИНХРОННО при загрузке приложения
 * по аналогии с aura-webapp для гарантии создания куки ДО авторизации.
 * 
 * Метрики:
 * - Google Analytics (через react-ga4) - синхронная инициализация
 * - Yandex Metrika - синхронная загрузка скрипта
 * - Facebook Pixel - синхронная загрузка скрипта
 * 
 * Это гарантирует что куки (_ga, _gid, _fbp, _fbc, _ym_uid) создаются
 * ДО того как пользователь достигнет экрана авторизации.
 */
export function MetricsProvider({ 
  children, 
  googleAnalyticsId, 
  yandexMetrikaId,
  facebookPixels = []
}: MetricsProviderProps) {
  
  // Инициализация Google Analytics (синхронно через react-ga4)
  useEffect(() => {
    if (!googleAnalyticsId) return;
    
    try {
      // Включаем debug mode для develop окружения
      const isDevelopEnvironment = typeof window !== 'undefined' && 
        window.location.hostname.includes('develop.funnel.witlab.us') ||
        window.location.hostname.includes('localhost');
      
      ReactGA.initialize(googleAnalyticsId, {
        gaOptions: {
          debug_mode: isDevelopEnvironment,
        },
      });
      
      console.log('✅ [Metrics] Google Analytics initialized:', {
        measurementId: googleAnalyticsId,
        debugMode: isDevelopEnvironment,
        ready: true,
      });
    } catch (error) {
      console.error('[Metrics] Failed to initialize Google Analytics:', error);
    }
  }, [googleAnalyticsId]);

  // Инициализация Yandex Metrika (официальный способ)
  useEffect(() => {
    if (!yandexMetrikaId) return;
    
    try {
      // Проверяем что скрипт еще не загружен
      if (typeof window.ym === 'function' && window.__YM_COUNTER_ID__) {
        console.log('[Metrics] Yandex Metrika already initialized');
        return;
      }

      // ✅ Официальный код инициализации Яндекс Метрики
      // Создает функцию-заглушку ym() для накопления вызовов до загрузки скрипта
      // eslint-disable-next-line @typescript-eslint/no-explicit-any
      (function(m: any, e: Document, t: string, r: string, i: string, k: HTMLScriptElement, a: HTMLScriptElement | null) {
        // eslint-disable-next-line prefer-rest-params
        m[i] = m[i] || function() { (m[i].a = m[i].a || []).push(arguments); };
        m[i].l = 1 * new Date().getTime();
        k = e.createElement(t) as HTMLScriptElement;
        a = e.getElementsByTagName(t)[0] as HTMLScriptElement;
        k.async = true;
        k.src = r;
        if (a && a.parentNode) {
          a.parentNode.insertBefore(k, a);
        }
      })(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym", {} as HTMLScriptElement, null);
      
      // ✅ Вызываем init сразу (накопится в очереди до загрузки скрипта)
      window.ym(Number(yandexMetrikaId), 'init', {
        clickmap: true,
        trackLinks: true,
        accurateTrackBounce: true,
        webvisor: true,
      });
      
      // Сохраняем ID счетчика для использования в analytics service
      window.__YM_COUNTER_ID__ = Number(yandexMetrikaId);
      
      console.log('✅ [Metrics] Yandex Metrika initialized:', {
        counterId: yandexMetrikaId,
        method: 'official',
        ready: true,
      });
    } catch (error) {
      console.error('[Metrics] Failed to initialize Yandex Metrika:', error);
    }
  }, [yandexMetrikaId]);

  // Инициализация Facebook Pixel (синхронно через скрипт)
  useEffect(() => {
    if (!facebookPixels || facebookPixels.length === 0) return;
    
    try {
      // Проверяем что fbq еще не загружен
      if (typeof window.fbq === 'function') {
        console.log('[Metrics] Facebook Pixel already loaded');
        return;
      }

      // Базовый код Facebook Pixel
      const fbqScript = `
        !function(f,b,e,v,n,t,s)
        {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
        n.callMethod.apply(n,arguments):n.queue.push(arguments)};
        if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
        n.queue=[];t=b.createElement(e);t.async=!0;
        t.src=v;s=b.getElementsByTagName(e)[0];
        s.parentNode.insertBefore(t,s)}(window, document,'script',
        'https://connect.facebook.net/en_US/fbevents.js');
      `;

      // Выполняем базовый код
      const script = document.createElement('script');
      script.type = 'text/javascript';
      script.innerHTML = fbqScript;
      document.head.appendChild(script);

      // Инициализируем каждый пиксель
      if (typeof window.fbq === 'function') {
        const fbq = window.fbq as ((...args: unknown[]) => void);
        facebookPixels.forEach((pixelId) => {
          fbq('init', pixelId);
          console.log('[Metrics] Facebook Pixel initialized:', pixelId);
        });
        
        // Отправляем PageView для всех пикселей
        fbq('track', 'PageView');
      }
    } catch (error) {
      console.error('[Metrics] Failed to initialize Facebook Pixel:', error);
    }
  }, [facebookPixels]);

  return <>{children}</>;
}
