"use client";

import { useState, useMemo, useCallback, type ReactNode } from "react";
import { useFlagsStatus } from "@unleash/proxy-client-react";
import { UnleashContextProvider } from "@/lib/funnel/unleash";
import { FunnelLoadingScreen } from "./FunnelLoadingScreen";
import { FlagVariantFetcher } from "./FlagVariantFetcher";
import type { NavigationConditionDefinition } from "@/lib/funnel/types";

interface FunnelUnleashWrapperProps {
  children: ReactNode;
  funnel: {
    screens: Array<{
      id: string;
      variants?: Array<{
        conditions: NavigationConditionDefinition[];
      }>;
      navigation?: {
        rules?: Array<{
          conditions: NavigationConditionDefinition[];
        }>;
      };
    }>;
  };
}

/**
 * Wrapper который собирает все Unleash флаги используемые в воронке
 * и передает их активные варианты в контекст
 */
export function FunnelUnleashWrapper({
  children,
  funnel,
}: FunnelUnleashWrapperProps) {
  const { flagsReady } = useFlagsStatus();

  // Собираем все уникальные флаги из воронки
  const allFlags = useMemo(() => {
    const flags = new Set<string>();

    funnel.screens.forEach((screen) => {
      // Флаги из вариантов экрана
      screen.variants?.forEach((variant) => {
        variant.conditions.forEach((condition) => {
          if (
            condition.conditionType === "unleash" &&
            condition.unleashFlag
          ) {
            flags.add(condition.unleashFlag);
          }
        });
      });

      // Флаги из правил навигации
      screen.navigation?.rules?.forEach((rule) => {
        rule.conditions.forEach((condition) => {
          if (
            condition.conditionType === "unleash" &&
            condition.unleashFlag
          ) {
            flags.add(condition.unleashFlag);
          }
        });
      });
    });

    return Array.from(flags);
  }, [funnel.screens]);

  // Состояние для хранения вариантов флагов
  const [loadedVariants, setLoadedVariants] = useState<Record<string, string>>({});

  // Колбэк для получения варианта от FlagVariantFetcher компонента
  const handleVariantLoaded = useCallback((flag: string, variant: string | undefined) => {
    if (variant && variant !== "disabled") {
      setLoadedVariants((prev) => {
        // Обновляем только если значение изменилось
        if (prev[flag] !== variant) {
          if (process.env.NODE_ENV === "development") {
            console.log(`[FunnelUnleashWrapper] Flag "${flag}" = "${variant}"`);
          }
          return { ...prev, [flag]: variant };
        }
        return prev;
      });
    }
  }, []);

  // Создаем объект активных вариантов
  const activeVariants = useMemo(() => {
    if (!flagsReady) {
      return {};
    }

    if (process.env.NODE_ENV === "development") {
      console.log("[FunnelUnleashWrapper] Active variants:", loadedVariants);
    }

    return loadedVariants;
  }, [flagsReady, loadedVariants]);

  // Показываем loader пока флаги загружаются
  // Это предотвращает flash of unstyled content
  if (!flagsReady) {
    return <FunnelLoadingScreen />;
  }

  return (
    <UnleashContextProvider activeVariants={activeVariants}>
      {/* Рендерим FlagVariantFetcher для каждого флага */}
      {allFlags.map((flag) => (
        <FlagVariantFetcher
          key={flag}
          flag={flag}
          onVariantLoaded={handleVariantLoaded}
        />
      ))}
      {children}
    </UnleashContextProvider>
  );
}
