/**
 * Copyright (c) 2015-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @format
 *
 */

'use strict'

import * as ReactPropTypes from 'prop-types'

import deprecatedPropType from './deprecatedPropType'

const TransformMatrixPropType = function (
  props,
  propName,
  _componentName
) {
  if (props[propName]) {
    return new Error(
      'The transformMatrix style property is deprecated. ' +
      'Use `transform: [{ matrix: ... }]` instead.'
    )
  }
}

const DecomposedMatrixPropType = function (
  props,
  propName,
  _componentName
) {
  if (props[propName]) {
    return new Error(
      'The decomposedMatrix style property is deprecated. ' +
      'Use `transform: [...]` instead.'
    )
  }
}

const TransformPropTypes = {
  /**
   * `transform` accepts an array of transformation objects. Each object specifies
   * the property that will be transformed as the key, and the value to use in the
   * transformation. Objects should not be combined. Use a single key/value pair
   * per object.
   *
   * The rotate transformations require a string so that the transform may be
   * expressed in degrees (deg) or radians (rad). For example:
   *
   * `transform([{ rotateX: '45deg' }, { rotateZ: '0.785398rad' }])`
   *
   * The skew transformations require a string so that the transform may be
   * expressed in degrees (deg). For example:
   *
   * `transform([{ skewX: '45deg' }])`
   */
  transform: ReactPropTypes.arrayOf(
    ReactPropTypes.oneOfType([
      ReactPropTypes.shape({ perspective: ReactPropTypes.number }),
      ReactPropTypes.shape({ rotate: ReactPropTypes.string }),
      ReactPropTypes.shape({ rotateX: ReactPropTypes.string }),
      ReactPropTypes.shape({ rotateY: ReactPropTypes.string }),
      ReactPropTypes.shape({ rotateZ: ReactPropTypes.string }),
      ReactPropTypes.shape({ scale: ReactPropTypes.number }),
      ReactPropTypes.shape({ scaleX: ReactPropTypes.number }),
      ReactPropTypes.shape({ scaleY: ReactPropTypes.number }),
      ReactPropTypes.shape({ translateX: ReactPropTypes.number }),
      ReactPropTypes.shape({ translateY: ReactPropTypes.number }),
      ReactPropTypes.shape({ skewX: ReactPropTypes.string }),
      ReactPropTypes.shape({ skewY: ReactPropTypes.string })
    ])
  ),

  /**
   * Deprecated. Use the transform prop instead.
   */
  transformMatrix: TransformMatrixPropType,
  /**
   * Deprecated. Use the transform prop instead.
   */
  decomposedMatrix: DecomposedMatrixPropType,

  /* Deprecated transform props used on Android only */
  scaleX: deprecatedPropType(
    ReactPropTypes.number,
    'Use the transform prop instead.'
  ),
  scaleY: deprecatedPropType(
    ReactPropTypes.number,
    'Use the transform prop instead.'
  ),
  rotation: deprecatedPropType(
    ReactPropTypes.number,
    'Use the transform prop instead.'
  ),
  translateX: deprecatedPropType(
    ReactPropTypes.number,
    'Use the transform prop instead.'
  ),
  translateY: deprecatedPropType(
    ReactPropTypes.number,
    'Use the transform prop instead.'
  )
}

export default TransformPropTypes
