const svgElementAttributes = require('svg-element-attributes')

const attributeCalls = /^(get|has|set|remove)Attribute$/
const validAttributeName = /^[a-z][a-z0-9-]*$/

// these are common SVG attributes that *must* have the correct case to work
const camelCaseAttributes = Object.values(svgElementAttributes)
  .reduce((all, elementAttrs) => all.concat(elementAttrs), [])
  .filter(name => !validAttributeName.test(name))

const validSVGAttributeSet = new Set(camelCaseAttributes)

// lowercase variants of camelCase SVG attributes are probably an error
const invalidSVGAttributeSet = new Set(camelCaseAttributes.map(name => name.toLowerCase()))

function isValidAttribute(name) {
  return validSVGAttributeSet.has(name) || (validAttributeName.test(name) && !invalidSVGAttributeSet.has(name))
}

module.exports = function(context) {
  return {
    CallExpression(node) {
      if (!node.callee.property) return

      const calleeName = node.callee.property.name
      if (!attributeCalls.test(calleeName)) return

      const attributeNameNode = node.arguments[0]
      if (!attributeNameNode) return

      if (!isValidAttribute(attributeNameNode.value)) {
        context.report({
          meta: {
            fixable: 'code'
          },
          node: attributeNameNode,
          message: 'Attributes should be lowercase and hyphen separated, or part of the SVG whitelist.',
          fix(fixer) {
            return fixer.replaceText(attributeNameNode, `'${attributeNameNode.value.toLowerCase()}'`)
          }
        })
      }
    }
  }
}