import { slicedToArray as _slicedToArray, toConsumableArray as _toConsumableArray } from '../_virtual/_rollupPluginBabelHelpers.js';

var getStaticVariants = function getStaticVariants(config) {
  if (!config.variations) {
    return [];
  }
  var res = [];
  var variations = config.variations;

  // eslint-disable-next-line guard-for-in
  for (var key in variations) {
    var css = variations[key].css;
    css && res.push(css);
  }
  return res;
};
var getDynamicVariants = function getDynamicVariants(config) {
  return function (props) {
    var res = [];

    // eslint-disable-next-line guard-for-in
    for (var key in config.variations) {
      if (key in props) {
        var variant = config.variations[key];
        var css = variant[props[key]];
        // no css for { modifier: true }
        css && Array.isArray(css) ? res.push.apply(res, _toConsumableArray(css)) : res.push(css);
      }
    }
    return res;
  };
};

/**
 * Собирает строку с @media-блоками для адаптивного режима.
 * Используется в исходнике конфига вертикали внутри css:
 *   responsive: css`${getResponsiveCSS([
 *       { from: 0,    to: 559,       size: sizeL },
 *       { from: 560,  to: 789,       size: sizeM },
 *       { from: 1023, to: undefined, size: sizeXL },
 *   ])}`
 *
 * `size` в правиле — это сами декларации (строка с присвоениями токенов),
 * а не имя вариации; декларации обычно вынесены в общую const, чтобы
 * переиспользоваться и в `variations.size.*`, и здесь.
 *
 * Для css/linaria-сборки linaria статически выполняет вызов на этапе сборки
 * вертикали и инлайнит готовый @media-CSS в скомпилированный класс; SC/emotion
 * получают то же в рантайме при первом обращении к модулю.
 *
 * Селектор `&&` поднимает специфичность на ×2, чтобы media-правило перебивало
 * обычную size-вариацию независимо от порядка правил в stylesheet.
 *
 * Семантика границ — диапазон ширины viewport в пикселях:
 *   from → min-width, to → max-width.
 *
 * Правила не пересекаются — массив просто конкатенируется.
 */
var getResponsiveCSS = function getResponsiveCSS(media) {
  return media.map(function (_ref) {
    var from = _ref.from,
      to = _ref.to,
      size = _ref.size;
    if (!size) {
      return '';
    }
    var parts = [];
    if (from !== undefined) {
      parts.push("(min-width: ".concat(from, "px)"));
    }
    if (to !== undefined) {
      parts.push("(max-width: ".concat(to, "px)"));
    }
    if (!parts.length) {
      return '';
    }
    return "@media ".concat(parts.join(' and '), " { && { ").concat(size, " } }");
  }).filter(Boolean).join('\n');
};
var getIntersectionStyles = function getIntersectionStyles(props, intersections) {
  if (!intersections) {
    return [];
  }
  return intersections.reduce(function (styles, item) {
    var hasMatchStyle = Object.entries(item).filter(function (_ref2) {
      var _ref3 = _slicedToArray(_ref2, 1),
        key = _ref3[0];
      return key !== 'style';
    }).every(function (_ref4) {
      var _ref5 = _slicedToArray(_ref4, 2),
        key = _ref5[0],
        value = _ref5[1];
      return props[key] === value;
    });
    if (hasMatchStyle) {
      styles.push(item.style);
    }
    return styles;
  }, []);
};

export { getDynamicVariants, getIntersectionStyles, getResponsiveCSS, getStaticVariants };
