/**
 * Copyright (c) Nicolas Gallagher.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @noflow
 */

const invalidShortforms = {
  background: true,
  borderBottom: true,
  borderLeft: true,
  borderRight: true,
  borderTop: true,
  font: true,
  grid: true,
  outline: true,
  textDecoration: true,
}

const invalidMultiValueShortforms = {
  flex: true,
  margin: true,
  padding: true,
  borderColor: true,
  borderRadius: true,
  borderStyle: true,
  borderWidth: true,
  marginHorizontal: true,
  marginVertical: true,
  paddingHorizontal: true,
  paddingVertical: true,
  overflow: true,
  overscrollBehavior: true,
  backgroundPosition: true,
}

function error(message) {
  console.error(message)
}

export function validate(obj: object) {
  for (const k in obj) {
    const prop = k.trim()
    const value = obj[prop]
    let isInvalid = false

    if (value === null) {
      continue
    }

    if (typeof value === 'string' && value.indexOf('!important') > -1) {
      error(
        `Invalid style declaration "${prop}:${value}". Values cannot include "!important"`
      )
      isInvalid = true
    } else {
      let suggestion = ''
      if (prop === 'animation' || prop === 'animationName') {
        suggestion = 'Did you mean "animationKeyframes"?'
        // } else if (prop === 'boxShadow') {
        //  suggestion = 'Did you mean "shadow{Color,Offset,Opacity,Radius}"?';
        isInvalid = true
      } else if (prop === 'direction') {
        suggestion = 'Did you mean "writingDirection"?'
        isInvalid = true
      } else if (prop === 'verticalAlign') {
        suggestion = 'Did you mean "textAlignVertical"?'
        isInvalid = true
      } else if (invalidShortforms[prop]) {
        suggestion = 'Please use long-form properties.'
        isInvalid = true
      } else if (invalidMultiValueShortforms[prop]) {
        // TODO
        // if (typeof value === 'string' && valueParser(value).nodes.length > 1) {
        //   suggestion = `Value is "${value}" but only single values are supported.`
        //   isInvalid = true
        // }
      }
      if (suggestion !== '') {
        error(`Invalid style property of "${prop}". ${suggestion}`)
      }
    }

    if (isInvalid) {
      delete obj[k]
    }
  }
}
