"use strict";

module.exports = function ({
  types: t
}) {
  const isVoid0 = require("babel-helper-is-void-0")(t);

  return {
    name: "minify-flip-comparisons",
    visitor: {
      // flip comparisons with a pure right hand value, this ensures
      // consistency with comparisons and increases the length of
      // strings that gzip can match
      // typeof blah === 'function' -> 'function' === typeof blah
      BinaryExpression(path) {
        const node = path.node;
        const right = node.right,
              left = node.left; // Make sure we have a constant on the right.

        if (!t.isLiteral(right) && !isVoid0(right) && !(t.isUnaryExpression(right) && t.isLiteral(right.argument)) && !t.isObjectExpression(right) && !t.isArrayExpression(right)) {
          return;
        } // Commutative operators.


        if (t.EQUALITY_BINARY_OPERATORS.indexOf(node.operator) >= 0 || ["*", "^", "&", "|"].indexOf(node.operator) >= 0) {
          node.left = right;
          node.right = left;
          return;
        }

        if (t.BOOLEAN_NUMBER_BINARY_OPERATORS.indexOf(node.operator) >= 0) {
          node.left = right;
          node.right = left;
          let operator;

          switch (node.operator) {
            case ">":
              operator = "<";
              break;

            case "<":
              operator = ">";
              break;

            case ">=":
              operator = "<=";
              break;

            case "<=":
              operator = ">=";
              break;
          }

          node.operator = operator;
          return;
        }
      }

    }
  };
};