import React, { useEffect, useRef } from 'react';
import { SafeAreaProvider, initialWindowMetrics as defaultInitialWindowMetrics } from 'react-native-safe-area-context';
import { SSRProvider } from '@react-native-aria/utils';
import { theme as defaultTheme } from './../theme';
import HybridProvider from './hybrid-overlay/HybridProvider';
import { OverlayProvider } from '@react-native-aria/overlays';
import { ToastProvider, ToastRef } from '../components/composites/Toast';
import { defaultConfig, NativeBaseConfigProvider } from './NativeBaseContext';
import { useToast } from '../components/composites/Toast';
import { Platform, useWindowDimensions } from 'react-native';
import { getClosestBreakpoint } from '../theme/tools/utils';
import { platformSpecificSpaceUnits } from '../theme/tools/platformSpecificSpaceUnits';
import { init as initResolvedStyleMap, resolvedStyledMap } from '../utils/styled';
import { uniqueId } from 'lodash';
initResolvedStyleMap(); // For SSR to work, we need to pass initial insets as 0 values on web.
// https://github.com/th3rdwave/react-native-safe-area-context/issues/132

const defaultInitialWindowMetricsBasedOnPlatform = Platform.select({
  web: {
    frame: {
      x: 0,
      y: 0,
      width: 0,
      height: 0
    },
    insets: {
      top: 0,
      left: 0,
      right: 0,
      bottom: 0
    }
  },
  default: defaultInitialWindowMetrics
});

const getComponentNamesFromTheme = theme => {
  const componentNames = theme !== null && theme !== void 0 && theme.components ? Object.keys(theme === null || theme === void 0 ? void 0 : theme.components) : [];
  return componentNames;
};

const getComponentVariants = componentTheme => {
  const variants = componentTheme.variants ? Object.keys(componentTheme.variants) : [];
  return variants;
};

const getComponentSizes = componentTheme => {
  const sizes = componentTheme.sizes ? Object.keys(componentTheme.sizes) : []; // console.log('component', componentTheme);

  return sizes;
};

function findCharacterFrequency(str, character) {
  let count = 0;

  for (let i = 0; i < str.length; i++) {
    if (str[i] === character) {
      count++;
    }
  }

  return count;
}

const isKeyWithSingleOrDoubleValue = key => {
  return findCharacterFrequency(key, '.') === 0 || findCharacterFrequency(key, '.') === 1 ? true : false;
};

const deleteFromResolvedMap = (object, providerId, value, condition) => {
  const keys = Object.keys(object === null || object === void 0 ? void 0 : object[providerId]);
  keys.forEach(key => {
    if (key.startsWith(value) && key.includes(condition)) {
      var _object$providerId;

      object === null || object === void 0 ? true : (_object$providerId = object[providerId]) === null || _object$providerId === void 0 ? true : delete _object$providerId[key];
    }

    if (key.startsWith(value) && !key.includes(condition) && isKeyWithSingleOrDoubleValue(key)) {
      var _object$providerId2;

      object === null || object === void 0 ? true : (_object$providerId2 = object[providerId]) === null || _object$providerId2 === void 0 ? true : delete _object$providerId2[key];
    }
  });
  return;
};

const NativeBaseProvider = props => {
  var _config$theme, _useWindowDimensions;

  const {
    colorModeManager,
    config = defaultConfig,
    children,
    theme: propsTheme = defaultTheme,
    initialWindowMetrics,
    isSSR,
    disableContrastText,
    providerId
  } = props; // @ts-ignore

  const {
    customUserTheme,
    ...theme
  } = (_config$theme = config.theme) !== null && _config$theme !== void 0 ? _config$theme : propsTheme;
  const ref = useRef(providerId !== null && providerId !== void 0 ? providerId : uniqueId('my-provider-'));
  useEffect(() => {
    let components = getComponentNamesFromTheme(customUserTheme);
    components.map(component => {
      var _customUserTheme$comp, _customUserTheme$comp2;

      let variants = getComponentVariants(customUserTheme === null || customUserTheme === void 0 ? void 0 : (_customUserTheme$comp = customUserTheme.components) === null || _customUserTheme$comp === void 0 ? void 0 : _customUserTheme$comp[component]);
      let sizes = getComponentSizes(customUserTheme === null || customUserTheme === void 0 ? void 0 : (_customUserTheme$comp2 = customUserTheme.components) === null || _customUserTheme$comp2 === void 0 ? void 0 : _customUserTheme$comp2[component]);
      variants.map(variant => {
        deleteFromResolvedMap(resolvedStyledMap, // @ts-ignore
        ref.current, component, variant);
      });
      sizes.map(size => {
        // @ts-ignore
        deleteFromResolvedMap(resolvedStyledMap, ref.current, component, size);
      });
    });
  }, [customUserTheme, providerId]);
  const newTheme = React.useMemo(() => {
    if (config.enableRem) {
      return platformSpecificSpaceUnits(theme);
    }

    return theme;
  }, [config.enableRem, theme]);
  const windowWidth = (_useWindowDimensions = useWindowDimensions()) === null || _useWindowDimensions === void 0 ? void 0 : _useWindowDimensions.width;
  const currentBreakpoint = React.useMemo(() => getClosestBreakpoint(newTheme.breakpoints, windowWidth), [windowWidth, newTheme.breakpoints]);
  return /*#__PURE__*/React.createElement(NativeBaseConfigProvider, {
    theme: newTheme,
    config: config,
    currentBreakpoint: currentBreakpoint,
    isSSR: isSSR,
    disableContrastText: disableContrastText,
    providerId: ref.current
  }, /*#__PURE__*/React.createElement(SafeAreaProvider, {
    initialMetrics: initialWindowMetrics !== null && initialWindowMetrics !== void 0 ? initialWindowMetrics : defaultInitialWindowMetricsBasedOnPlatform
  }, /*#__PURE__*/React.createElement(HybridProvider, {
    colorModeManager: colorModeManager,
    options: theme.config
  }, /*#__PURE__*/React.createElement(OverlayProvider, null, /*#__PURE__*/React.createElement(ToastProvider, null, /*#__PURE__*/React.createElement(InitializeToastRef, null), /*#__PURE__*/React.createElement(SSRProvider, null, children))))));
};

const InitializeToastRef = () => {
  const toast = useToast();
  ToastRef.current = toast;
  return null;
};

export { NativeBaseProvider };
//# sourceMappingURL=NativeBaseProvider.js.map