"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };

exports.default = replaceRuleSelector;

var _list = require("postcss/lib/list");

var _list2 = _interopRequireDefault(_list);

var _balancedMatch = require("balanced-match");

var _balancedMatch2 = _interopRequireDefault(_balancedMatch);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

var pseudoClass = ":matches";
var selectorElementRE = /^[a-zA-Z]/;

function isElementSelector(selector) {
  var matches = selectorElementRE.exec(selector);
  // console.log({selector, matches})
  return matches;
}

function normalizeSelector(selector, preWhitespace, pre) {
  if (isElementSelector(selector) && !isElementSelector(pre)) {
    return "" + preWhitespace + selector + pre;
  }

  return "" + preWhitespace + pre + selector;
}

function explodeSelector(selector, options) {
  if (selector && selector.indexOf(pseudoClass) > -1) {
    var _ret = function () {
      var newSelectors = [];
      var preWhitespaceMatches = selector.match(/^\s+/);
      var preWhitespace = preWhitespaceMatches ? preWhitespaceMatches[0] : "";
      var selectorPart = _list2.default.comma(selector);
      selectorPart.forEach(function (part) {
        var position = part.indexOf(pseudoClass);
        var pre = part.slice(0, position);
        var body = part.slice(position);
        var matches = (0, _balancedMatch2.default)("(", ")", body);

        var bodySelectors = matches && matches.body ? _list2.default.comma(matches.body).reduce(function (acc, s) {
          return [].concat(_toConsumableArray(acc), _toConsumableArray(explodeSelector(s, options)));
        }, []) : [body];

        var postSelectors = matches && matches.post ? explodeSelector(matches.post, options) : [];

        var newParts = void 0;
        if (postSelectors.length === 0) {
          // the test below is a poor way to try we are facing a piece of a
          // selector...
          if (position === -1 || pre.indexOf(" ") > -1) {
            newParts = bodySelectors.map(function (s) {
              return preWhitespace + pre + s;
            });
          } else {
            newParts = bodySelectors.map(function (s) {
              return normalizeSelector(s, preWhitespace, pre);
            });
          }
        } else {
          newParts = [];
          postSelectors.forEach(function (postS) {
            bodySelectors.forEach(function (s) {
              newParts.push(preWhitespace + pre + s + postS);
            });
          });
        }
        newSelectors = [].concat(_toConsumableArray(newSelectors), _toConsumableArray(newParts));
      });

      return {
        v: newSelectors
      };
    }();

    if ((typeof _ret === "undefined" ? "undefined" : _typeof(_ret)) === "object") return _ret.v;
  }
  return [selector];
}

function replaceRuleSelector(rule, options) {
  var indentation = rule.raws && rule.raws.before ? rule.raws.before.split("\n").pop() : "";
  return explodeSelector(rule.selector, options).join("," + (options.lineBreak ? "\n" + indentation : " "));
}