React = require 'react'

{li} = require 'react-dom-factories'

###
Form Validation

@props.showValidationErrors - OPTIONAL - Boolean
  indicator to determine whether validation errors should be visible on the element

@props.validation - OPTIONAL - Array
  Array of validation evaluation rules. Required if validation is being used.

###

module.exports = 

  elementValid: true

  validationErrors: []

  validationErrorIds: []

  getDefaultProps: -> 
    {
      validation: []
      showValidationErrors: false
    }

  isValid: ->
    return @elementValid

  getErrors: ->
    {validation, showValidationErrors} = @props
    @validationErrors = []
    @validationErrorIds = []
    errors = []

    if validation?
      for evaluation, index in validation when evaluation?.valid is false
        {error, id} = evaluation

        # Track the IDs of the errors, if being used
        @validationErrorIds.push(id) if id

        # Add the validation errors for display
        @validationErrors.push(li {
          className: 'field-error'
          key: error
        }, error)

        # Since there are validation errors, run the validate method again
        @validateElement()

    @invalidClass = if @validationErrors.length and showValidationErrors then ' invalid' else ''

  validateElement: ->
    @elementValid = @validationErrors.length is 0

  componentDidUpdate: ->
    @validateElement()