/* @flow */
"use strict";

const autoprefixer = require("autoprefixer");
const Browsers = require("autoprefixer/lib/browsers");
const Prefixes = require("autoprefixer/lib/prefixes");

/**
 * Use Autoprefixer's secret powers to determine whether or
 * not a certain CSS identifier contains a vendor prefix that
 * Autoprefixer, given the standardized identifier, could add itself.
 *
 * Used by `*-no-vendor-prefix-*` rules to find superfluous
 * vendor prefixes.
 */

const prefixes = new Prefixes(
  autoprefixer.data.prefixes,
  new Browsers(autoprefixer.data.browsers, [])
);

/**
 * Most identifier types have to be looked up in a unique way,
 * so we're exposing special functions for each.
 */
module.exports = {
  atRuleName(identifier /*: string*/) /*: boolean*/ {
    return prefixes.remove[`@${identifier.toLowerCase()}`];
  },

  selector(identifier /*: string*/) /*: boolean*/ {
    return prefixes.remove.selectors.some(selectorObj => {
      return identifier.toLowerCase() === selectorObj.prefixed;
    });
  },

  mediaFeatureName(identifier /*: string*/) /*: boolean*/ {
    return identifier.toLowerCase().indexOf("device-pixel-ratio") !== -1;
  },

  property(identifier /*: string*/) /*: boolean*/ {
    return autoprefixer.data.prefixes[
      prefixes.unprefixed(identifier.toLowerCase())
    ];
  },

  propertyValue(prop /*: string*/, value /*: string*/) /*: boolean*/ {
    const possiblePrefixableValues =
      prefixes.remove[prop.toLowerCase()] &&
      prefixes.remove[prop.toLowerCase()].values;
    return (
      possiblePrefixableValues &&
      possiblePrefixableValues.some(valueObj => {
        return value.toLowerCase() === valueObj.prefixed;
      })
    );
  }
};