/* @flow */
"use strict"

const keywordSets = require("../reference/keywordSets")
const getUnitFromValueNode = require("./getUnitFromValueNode")
const isStandardSyntaxValue = require("./isStandardSyntaxValue")
const isVariable = require("./isVariable")
const postcssValueParser = require("postcss-value-parser")

/**
 * Get the font-families within a `font` shorthand property value.
 */
module.exports = function findAnimationName(value/*: string*/)/*: Array<Object>*/ {
  const animationNames = []

  const valueNodes = postcssValueParser(value)

  // Handle `inherit`, `initial` and etc
  if (valueNodes.nodes.length === 1 && keywordSets.basicKeywords.has(valueNodes.nodes[0].value.toLowerCase())) {
    return [valueNodes.nodes[0]]
  }

  valueNodes.walk(valueNode => {
    if (valueNode.type === "function") {
      return false
    }
    if (valueNode.type !== "word") {
      return
    }

    const valueLowerCase = valueNode.value.toLowerCase()

    // Ignore non standard syntax
    if (!isStandardSyntaxValue(valueLowerCase)) {
      return
    }
    // Ignore variables
    if (isVariable(valueLowerCase)) {
      return
    }
    // Ignore keywords for other font parts
    if (keywordSets.animationShorthandKeywords.has(valueLowerCase)) {
      return
    }
    // Ignore numbers with units
    const unit = getUnitFromValueNode(valueNode)
    if (unit || unit === "") {
      return
    }

    animationNames.push(valueNode)
  })

  return animationNames
}