{# Renders field for bootstrap 3 standards.

    Params:
        field - WTForm field
        kwargs - pass any arguments you want in order to put them into the html attributes.
        There are few exceptions: for - for_, class - class_, class__ - class_

    Example usage:
        {{ horz_form.field(form.email, placeholder='Input email', type='email') }}
#}

{% macro div_form_group(field) -%}
    <div class="form-group {{ 'required' if field.flags.required }} {{ 'has-error' if field.errors }} {{ kwargs.get('class_', '') }}">
        {{ caller(**kwargs) }}
    </div>
{%- endmacro %}

{% macro description(field) -%}
  <div class="description">
        <a type="button" class="btn btn-default" rel="kegel-field-description"
            title="{{ field.label.text }} Field" tabindex="-1"
            data-field-description-content="#{{ field.id }}_description_content">?</a>
    <div id="{{ field.id }}_description_content" class="hide">
        {% if field.description is callable %}
            {{ field.description()|safe }}
        {% else %}
            {{ field.description|safe }}
        {% endif %}
    </div>
  </div>
{%- endmacro %}

{% macro field(field, label_visible=true) -%}
{# You will need javascript similar to below for descriptions to work properly

    $('[rel="kegel-field-description"]').popover({
        container: 'body',
        html: true,
        trigger: 'focus',
        content: function () {
            var clone = $($(this).data('field-description-content')).clone(true).removeClass('hide');
            return clone;
        }
    }).click(function(e) {
        e.preventDefault();
    });
#}
    {% call div_form_group(field, **kwargs) %}
        {% if (field.type != 'HiddenField' and field.type != 'CSRFTokenField') and label_visible %}
            {{ field.label(class_='control-label') }}
        {% endif %}
        <div class="labeled-group">
            {{ field_widget(field, **kwargs) }}
        </div>
        {% if field.description %}
            {{ description(field) }}
        {% endif %}
    {% endcall %}
{%- endmacro %}

{% macro field_widget(field) %}
    {{ field(class_='form-control', disabled=field.flags.disabled, readonly=field.flags.readonly, **kwargs) }}
    {% if field.errors %}
        {% for e in field.errors %}
            <p class="help-block">{{ e }}</p>
        {% endfor %}
    {% endif %}
{% endmacro %}

{# Renders checkbox fields since they are represented differently in bootstrap
    Params:
        field - WTForm field (there are no check, but you should put here only BooleanField.
        kwargs - pass any arguments you want in order to put them into the html attributes.
        There are few exceptions: for - for_, class - class_, class__ - class_

    Example usage:
        {{ horiz_form.checkbox_field(form.remember_me) }}
 #}
{% macro checkbox_field(field) -%}
    {% call div_form_group(field, **kwargs) %}
        <div class="unlabeled-group checkbox">
            <label>
                {{ field(type='checkbox', **kwargs) }} {{ field.label }}
            </label>
            {% if field.errors %}
                {% for e in field.errors %}
                    <p class="help-block">{{ e }}</p>
                {% endfor %}
            {% endif %}
        </div>
        {% if field.description %}
            {{ description(field) }}
        {% endif %}
    {% endcall %}
{%- endmacro %}

{# Renders radio field
    Params:
        field - WTForm field (must have an `iter_choices` method)
        kwargs - pass any arguments you want in order to put them into the html attributes.
        There are few exceptions: for - for_, class - class_, class__ - class_

    Example usage:
        {{ horiz_form.radio_field(form.answers) }}
 #}
{% macro radio_field(field, label_visible=true) -%}
    {% call div_form_group(field, **kwargs) %}
        {% if label_visible %}
            {{ field.label(class_='control-label') }}
        {% endif %}
        <div class="labeled-group">
        {% for value, label, checked in field.iter_choices() %}
            <div class="radio">
                <label>
                    <input type="radio"
                           name="{{ field.id }}"
                           id="{{ field.id }}"
                           value="{{ value }}"
                           {{ 'checked' if checked }}
                           {{ 'disabled' if field.flags.disabled or (field.flags.readonly and not checked) }}>
                        {{ label }}
                </label>
            </div>
        {% endfor %}
        {% if field.errors %}
            {% for e in field.errors %}
                <p class="help-block">{{ e }}</p>
            {% endfor %}
        {% endif %}
        </div>
        {% if field.description %}
            {{ description(field) }}
        {% endif %}
    {% endcall %}
{%- endmacro %}

{% macro submit_group(action_text='Submit', btn_class='btn btn-primary', cancel_url='') -%}
    <div class="form-group">
      <div class="unlabeled-group">
        <button type="submit" class="{{ btn_class }}">{{ action_text }} </button>
        {% if cancel_url %}
            <a href="{{cancel_url}}" class="cancel">Cancel</a>
        {% endif %}
      </div>
    </div>
{%- endmacro %}

{% macro render_field(f) -%}
    {% if f.type == 'BooleanField' %}
        {{ checkbox_field(f) }}
    {% elif f.type == 'RadioField' %}
        {{ radio_field(f) }}
    {% elif f is none %}
        {# Do nothing b/c the field is None #}
    {% else %}
        {{ field(f) }}
    {% endif %}
{%- endmacro %}


{% macro form_errors(form) -%}
    {% if form.form_errors %}
        <div class="has-error">
            {% for e in form.form_errors %}
                <p class="help-block">{{ e }}</p>
            {% endfor %}
        </div>
    {% endif %}
{% endmacro %}


{# Renders WTForm in bootstrap way. There are two ways to call function:
     - as macros: it will render all field forms using cycle to iterate over them
     - as call: it will insert form fields as you specify:
     e.g. {% call macros.render_form(form, action_url=url_for('login_view'), action_text='Login',
                                        class_='login-form') %}
                {{ macros.render_field(form.email, placeholder='Input email', type='email') }}
                {{ macros.render_field(form.password, placeholder='Input password', type='password') }}
                {{ macros.render_checkbox_field(form.remember_me, type='checkbox') }}
            {% endcall %}

     Params:
        form - WTForm class
        action_url - url where to submit this form
        action_text - text of submit button
        class_ - sets a class for form
#}
{% macro form(
    form,
    field_names=None,
    action_url='',
    action_text='Submit',
    class_='form-horizontal',
    btn_class='btn btn-primary',
    cancel_url='',
    form_upload=false,
    dirty_check=false
) -%}

    <form method="POST"
          action="{{ action_url }}"
          role="form"
          class="{{ class_ }}"
          {% if form_upload %}enctype="multipart/form-data"{% endif %}
          {% if dirty_check %}data-dirty-check="on"{% endif %}
    >
        {{ form.hidden_tag() if form.hidden_tag }}

        {{ form_errors(form) }}

        {% if caller %}
            {{ caller() }}
        {% elif field_names %}
            {{ fields(form, field_names) }}
        {% else %}
            {% for f in form %}
                {{ render_field(f) }}
            {% endfor %}
        {% endif %}
        {{ submit_group(action_text=action_text, btn_class=btn_class, cancel_url=cancel_url) }}
    </form>
{%- endmacro %}

{% macro fields(form, field_names) -%}
    {% for field_name in field_names %}
        {{ render_field(form[field_name]) }}
    {% endfor %}
{%- endmacro %}

{% macro section(heading, form, field_names) -%}
    <h2>{{heading}}</h2>
    {% if caller %}
        {{ caller() }}
    {% else %}
        {{ fields(form, field_names) }}
    {% endif %}
{%- endmacro %}
