"use strict";

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

function plugin(targets, nodeTypes, detect) {
  class Plugin {
    constructor(result) {
      this.nodes = [];
      this.result = result;
      this.targets = targets;
      this.nodeTypes = nodeTypes;
    }

    push(node, metadata) {
      node._stylehacks = Object.assign({}, metadata, {
        message: `Bad ${metadata.identifier}: ${metadata.hack}`,
        browsers: this.targets
      });
      this.nodes.push(node);
    }

    any(node) {
      if (this.nodeTypes.includes(node.type)) {
        detect.apply(this, arguments);
        return !!node._stylehacks;
      }

      return false;
    }

    detectAndResolve(...args) {
      this.nodes = [];
      detect.apply(this, args);
      return this.resolve();
    }

    detectAndWarn(...args) {
      this.nodes = [];
      detect.apply(this, args);
      return this.warn();
    }

    resolve() {
      return this.nodes.forEach(node => node.remove());
    }

    warn() {
      return this.nodes.forEach(node => {
        const {
          message,
          browsers,
          identifier,
          hack
        } = node._stylehacks;
        return node.warn(this.result, message, {
          browsers,
          identifier,
          hack
        });
      });
    }

  }

  return Plugin;
}

module.exports = exports.default;