import { conditionsMet } from './FormLogicConditionChecker'
class FormLogicPropertyResolver {
  conditionsMet = conditionsMet;
  property = null;
  formData = null;
  logic = false;

  constructor (property, formData) {
    this.property = property
    this.formData = formData
    this.logic = (property.logic !== undefined) ? property.logic : false
  }

  isHidden () {
    if (!this.logic) {
      return this.property.hidden
    }

    const conditionsMet = this.conditionsMet(this.logic.conditions, this.formData)
    if (conditionsMet && this.property.hidden && this.logic.actions.length > 0 && this.logic.actions.includes('show-block')) {
      return false
    } else if (conditionsMet && !this.property.hidden && this.logic.actions.length > 0 && this.logic.actions.includes('hide-block')) {
      return true
    } else {
      return this.property.hidden
    }
  }

  isRequired () {
    if (!this.logic) {
      return this.property.required
    }

    const conditionsMet = this.conditionsMet(this.logic.conditions, this.formData)
    if (conditionsMet && this.property.required && this.logic.actions.length > 0 && this.logic.actions.includes('make-it-optional')) {
      return false
    } else if (conditionsMet && !this.property.required && this.logic.actions.length > 0 && this.logic.actions.includes('require-answer')) {
      return true
    } else {
      return this.property.required
    }
  }

  isDisabled () {
    if (!this.logic) {
      return this.property.disabled
    }

    const conditionsMet = this.conditionsMet(this.logic.conditions, this.formData)
    if (conditionsMet && this.property.disabled && this.logic.actions.length > 0 && this.logic.actions.includes('enable-block')) {
      return false
    } else if (conditionsMet && !this.property.disabled && this.logic.actions.length > 0 && this.logic.actions.includes('disable-block')) {
      return true
    } else {
      return this.property.disabled
    }
  }
}

export default FormLogicPropertyResolver