{% from "../../macros/attributes.njk" import govukAttributes %}
{% from "../error-message/macro.njk" import govukErrorMessage %}
{% from "../fieldset/macro.njk" import govukFieldset %}
{% from "../hint/macro.njk" import govukHint %}
{% from "../label/macro.njk" import govukLabel %}

{#- If an id 'prefix' is not passed, fall back to using the name attribute
  instead. We need this for error messages and hints as well -#}
{% set idPrefix = params.idPrefix if params.idPrefix else params.name %}

{#- a record of other elements that we need to associate with the input using
  aria-describedby – for example hints or error messages -#}
{% set describedBy = params.describedBy if params.describedBy else "" %}
{% if params.fieldset.describedBy %}
  {% set describedBy = params.fieldset.describedBy %}
{% endif %}

{#- fieldset is false by default -#}
{% set hasFieldset = true if params.fieldset else false %}

{%- macro _checkboxItem(params, item, index) %}
  {#- If the user explicitly sets an id, use this instead of the regular idPrefix -#}
  {#- The first id should not have a number suffix so it's easy to link to from the error summary component -#}
  {% set itemId = item.id if item.id else idPrefix + ("-" + index if index > 1 else "") %}
  {% set itemName = item.name if item.name else params.name %}
  {% set conditionalId = "conditional-" + itemId %}
  {%- if item.divider %}
    <div class="govuk-checkboxes__divider">{{ item.divider }}</div>
  {% else %}
    {% set isChecked = item.checked | default((item.value in params.values and item.checked != false) if params.values else false, true) %}
    {% set hasHint = true if item.hint.text or item.hint.html %}
    {% set itemHintId = itemId + "-item-hint" if hasHint else "" %}
    {% set itemDescribedBy = describedBy if not hasFieldset else "" %}
    {% set itemDescribedBy = (itemDescribedBy + " " + itemHintId) | trim %}
    <div class="govuk-checkboxes__item">
      <input class="govuk-checkboxes__input" id="{{ itemId }}" name="{{ itemName }}" type="checkbox" value="{{ item.value }}"
        {{-" checked" if isChecked }}
        {{-" disabled" if item.disabled }}
        {%- if item.conditional.html %} data-aria-controls="{{ conditionalId }}"{% endif -%}
        {%- if item.behaviour %} data-behaviour="{{ item.behaviour }}"{% endif -%}
        {%- if itemDescribedBy %} aria-describedby="{{ itemDescribedBy }}"{% endif -%}
        {{- govukAttributes(item.attributes) }}>
      {{ govukLabel({
        html: item.html,
        text: item.text,
        classes: 'govuk-checkboxes__label' + (' ' + item.label.classes if item.label.classes),
        attributes: item.label.attributes,
        for: itemId
      }) | trim | indent(6) }}
      {% if hasHint %}
      {{ govukHint({
        id: itemHintId,
        classes: 'govuk-checkboxes__hint' + (' ' + item.hint.classes if item.hint.classes),
        attributes: item.hint.attributes,
        html: item.hint.html,
        text: item.hint.text
      }) | trim | indent(6) }}
      {% endif %}
    </div>
    {% if item.conditional.html %}
    <div class="govuk-checkboxes__conditional {%- if not isChecked %} govuk-checkboxes__conditional--hidden{% endif %}" id="{{ conditionalId }}">
      {{ item.conditional.html | safe | trim }}
    </div>
    {% endif %}
  {% endif %}
{% endmacro -%}

{#- Capture the HTML so we can optionally nest it in a fieldset -#}
{% set innerHtml %}
{% if params.hint %}
  {% set hintId = idPrefix + '-hint' %}
  {% set describedBy = describedBy + ' ' + hintId if describedBy else hintId %}
  {{ govukHint({
    id: hintId,
    classes: params.hint.classes,
    attributes: params.hint.attributes,
    html: params.hint.html,
    text: params.hint.text
  }) | trim | indent(2) }}
{% endif %}
{% if params.errorMessage %}
  {% set errorId = idPrefix + '-error' %}
  {% set describedBy = describedBy + ' ' + errorId if describedBy else errorId %}
  {{ govukErrorMessage({
    id: errorId,
    classes: params.errorMessage.classes,
    attributes: params.errorMessage.attributes,
    html: params.errorMessage.html,
    text: params.errorMessage.text,
    visuallyHiddenText: params.errorMessage.visuallyHiddenText
  }) | trim | indent(2) }}
{% endif %}
  <div class="govuk-checkboxes {%- if params.classes %} {{ params.classes }}{% endif %}"
    {{- govukAttributes(params.attributes) }} data-module="govuk-checkboxes">
    {% if params.formGroup.beforeInputs %}
    {{ params.formGroup.beforeInputs.html | safe | trim | indent(4) if params.formGroup.beforeInputs.html else params.formGroup.beforeInputs.text }}
    {% endif %}
    {% for item in params.items %}
      {% if item %}
        {{- _checkboxItem(params, item, loop.index) -}}
      {% endif %}
    {% endfor %}
    {% if params.formGroup.afterInputs %}
    {{ params.formGroup.afterInputs.html | safe | trim | indent(4) if params.formGroup.afterInputs.html else params.formGroup.afterInputs.text }}
    {% endif %}
  </div>
{% endset -%}

<div class="govuk-form-group {%- if params.errorMessage %} govuk-form-group--error{% endif %} {%- if params.formGroup.classes %} {{ params.formGroup.classes }}{% endif %}"
  {{- govukAttributes(params.formGroup.attributes) }}>
{% if hasFieldset %}
  {{ govukFieldset({
    describedBy: describedBy,
    classes: params.fieldset.classes,
    attributes: params.fieldset.attributes,
    legend: params.fieldset.legend,
    html: innerHtml | trim
  }) | trim | indent(2) }}
{% else %}
  {{ innerHtml | safe | trim }}
{% endif %}
</div>
