"use strict";

const isStandardSyntaxRule = require("../utils/isStandardSyntaxRule");
const parseSelector = require("../utils/parseSelector");
const report = require("../utils/report");
const styleSearch = require("style-search");

module.exports = function(options) {
  options.root.walkRules(rule => {
    if (!isStandardSyntaxRule(rule)) {
      return;
    }
    if (
      rule.selector.indexOf("[") === -1 ||
      rule.selector.indexOf("=") === -1
    ) {
      return;
    }

    parseSelector(rule.selector, options.result, rule, selectorTree => {
      selectorTree.walkAttributes(attributeNode => {
        const operator = attributeNode.operator;

        if (!operator) {
          return;
        }

        const attributeNodeString = attributeNode.toString();

        styleSearch(
          { source: attributeNodeString, target: operator },
          match => {
            const index = options.checkBeforeOperator
              ? match.startIndex
              : match.endIndex - 1;
            checkOperator(
              attributeNodeString,
              index,
              rule,
              attributeNode.sourceIndex,
              operator
            );
          }
        );
      });
    });

    function checkOperator(source, index, node, attributeIndex, operator) {
      options.locationChecker({
        source,
        index,
        err: m =>
          report({
            message: m.replace(
              options.checkBeforeOperator
                ? operator[0]
                : operator[operator.length - 1],
              operator
            ),
            node,
            index: attributeIndex + index,
            result: options.result,
            ruleName: options.checkedRuleName
          })
      });
    }
  });
};