{% macro render_field(field) %}
  {% if field.type == 'BooleanField' %}
    {{ render_boolean_field(field, *args, **kwargs) }}
  {% elif field.type == 'FileField' %}
    {{ render_file_field(field, *args, **kwargs) }}
  {% elif field.type == 'IntegerField' %}
    {{ render_integer_field(field, *args, **kwargs) }}
  {% elif field.type == 'MultipleFileField' %}
    {{ render_multiple_file_field(field, *args, **kwargs) }}
  {% elif field.type == 'StringField' %}
    {{ render_string_field(field, *args, **kwargs) }}
  {% elif field.type == 'SubmitField' %}
    {{ render_submit_field(field, *args, **kwargs) }}
  {% elif field.type == 'TextAreaField' %}
    {{ render_text_area_field(field, *args, **kwargs) }}
  {% else %}
    {{ render_generic_field(field, *args, **kwargs) }}
  {% endif %}
{% endmacro %}


{% macro render_boolean_field(field) %}
  <div>
    <label>
      {{ field(*args, **kwargs) }}
      <span>{{ field.label.text }}</span>
      {% for error in field.errors %}
        <span class="helper-text error-color-text">{{ error }}</span>
      {% endfor %}
    </label>
  </div>
{% endmacro %}


{% macro render_file_field(field) %}
  {% set placeholder = kwargs.pop('placeholder', '') %}

  <div class="file-field input-field">
    <div class="btn">
      <span>{{ field.label.text }}</span>
      {{ field(*args, **kwargs) }}
    </div>
    <div class="file-path-wrapper">
      <input class="file-path validate" type="text" placeholder="{{ placeholder }}">
    </div>
    {% for error in field.errors %}
      <span class="helper-text error-color-text">{{ error }}</span>
    {% endfor %}
  </div>
{% endmacro %}


{% macro render_integer_field(field) %}
    {% set classes = kwargs.pop('class_', '').split(' ') %}

    {% if 'validate' not in classes %}
      {% set _ = classes.append('validate') %}
    {% endif %}

    {% set _ = kwargs.update({'class_': ' '.join(classes)}) %}

    {{ render_generic_field(field, *args, **kwargs) }}
{% endmacro %}


{% macro render_multiple_file_field(field) %}
  {% set placeholder = kwargs.pop('placeholder', '') %}

  <div class="file-field input-field">
    <div class="btn">
      <span>{{ field.label.text }}</span>
      {{ field(*args, **kwargs) }}
    </div>
    <div class="file-path-wrapper">
      <input class="file-path validate" type="text" placeholder="{{ placeholder }}">
    </div>
    {% for error in field.errors %}
      <span class="helper-text error-color-text">{{ error }}</span>
    {% endfor %}
  </div>
{% endmacro %}


{% macro render_string_field(field) %}
    {% set classes = kwargs.pop('class_', '').split(' ') %}

    {% if 'validate' not in classes %}
      {% set _ = classes.append('validate') %}
    {% endif %}

    {% set _ = kwargs.update({'class_': ' '.join(classes)}) %}

    {{ render_generic_field(field, *args, **kwargs) }}
{% endmacro %}


{% macro render_submit_field(field) %}
  <button class="btn waves-effect waves-light" id="{{ field.id }}" name="{{ field.name }}" type="submit" value="Submit">
    {{ field.label.text }}
    {% if 'material_icon' in kwargs %}
      <i class="material-icons right">{{ kwargs.pop('material_icon') }}</i>
    {% endif %}
  </button>
{% endmacro %}


{% macro render_text_area_field(field) %}
    {% set classes = kwargs.pop('class_', '').split(' ') %}

    {% if 'materialize-textarea' not in classes %}
      {% set _ = classes.append('materialize-textarea') %}
    {% endif %}

    {% if 'validate' not in classes %}
      {% set _ = classes.append('validate') %}
    {% endif %}

    {% set _ = kwargs.update({'class_': ' '.join(classes)}) %}

    {{ render_generic_field(field, *args, **kwargs) }}
{% endmacro %}


{% macro render_generic_field(field) %}
  <div class="input-field">
    {% if 'material_icon' in kwargs %}
      <i class="material-icons prefix">{{ kwargs.pop('material_icon') }}</i>
    {% endif %}
    {{ field(*args, **kwargs) }}
    {{ field.label }}
    {% for error in field.errors %}
      <span class="helper-text error-color-text">{{ error }}</span>
    {% endfor %}
  </div>
{% endmacro %}