{% from "nhsuk/components/heading/macro.njk" import heading as nhsukHeading %}
{% from "nhsuk/components/card/action/macro.njk" import cardAction as nhsukCardAction %}
{% from "nhsuk/macros/attributes.njk" import nhsukAttributes %}
{% from "nhsuk/macros/icon.njk" import nhsukIcon %}

{#- Set variant or (deprecated) type for this component #}
{%- set variant = params.variant or params.type -%}

{#- Set classes for this component #}
{%- set classNames = "nhsuk-card" -%}
{%- set classNamesHeading = "nhsuk-card__heading" -%}

{#- Support heading as string (with deprecated options) #}
{%- set heading = params.heading if params.heading is mapping and params.heading is not escaped else {
  id: params.headingId,
  text: params.heading if params.heading is string else undefined,
  html: params.heading if params.heading is escaped else params.headingHtml,
  visuallyHiddenText: params.headingVisuallyHiddenText,
  size: params.headingSize,
  level: params.headingLevel,
  classes: params.headingClasses
} -%}

{#- Support description as string (with deprecated options) #}
{%- set description = params.description if params.description is mapping and params.description is not escaped else {
  text: params.description if params.description is string else undefined,
  html: params.description if params.description is escaped else params.descriptionHtml
} -%}

{%- if params.clickable %}
  {% set classNames = classNames ~ " nhsuk-card--clickable" %}
{% endif %}

{%- if params.feature %}
  {% set classNames = classNames ~ " nhsuk-card--feature" %}
{% endif %}

{%- if params.primary %}
  {% set classNames = classNames ~ " nhsuk-card--primary" %}
{% endif %}

{%- if params.secondary %}
  {% set classNames = classNames ~ " nhsuk-card--secondary" %}
{% endif %}

{%- if params.warning %}
  {% set classNames = classNames ~ " nhsuk-card--warning" %}
{% endif %}

{%- if variant and
  variant in ["feature", "primary", "secondary", "warning"] and (
    not params.classes or (
      not "nhsuk-card--feature" in params.classes and
      not "nhsuk-card--primary" in params.classes and
      not "nhsuk-card--secondary" in params.classes and
      not "nhsuk-card--warning" in params.classes
    )
  )
%}
  {% set classNames = classNames ~ " nhsuk-card--" ~ variant %}
{% endif %}

{%- set isCareCard = true if variant
  and variant in ["non-urgent", "urgent", "emergency"]
  and (heading.text or heading.html)
  else false -%}

{%- if isCareCard and (
    not params.classes or (
      not "nhsuk-card--care--non-urgent" in params.classes and
      not "nhsuk-card--care--urgent" in params.classes and
      not "nhsuk-card--care--emergency" in params.classes
    )
  )
%}
  {% set classNames = classNames ~ " nhsuk-card--care nhsuk-card--care--" ~ variant %}
{% endif %}

{%- if params.classes %}
  {% set classNames = classNames ~ " " ~ params.classes %}
{% endif %}

{#- Support actions as array #}
{%- set actions = params.actions | select("mapping") | list if params.actions and params.actions is iterable else [] %}
{%- set actions = params.actions.items | select("mapping") | list if params.actions.items and not actions | length else actions %}

{%- set image = {
  src: params.imgURL,
  alt: params.imgALT
} if (params.imgURL or params.imgALT) else params.image %}

{%- macro _careHeading(params, parent, classNamesHeading) %}
{%- set headingVisuallyHiddenText %}
  {%- if heading.visuallyHiddenText -%}
    {{ heading.visuallyHiddenText | trim }}
  {%- elif variant == "emergency" -%}
    Immediate action required
  {%- elif variant == "urgent" -%}
    Urgent advice
  {%- else -%}
    Non-urgent advice
  {%- endif -%}
{% endset -%}

{{ _cardHeading({
  id: heading.id,
  text: heading.text,
  html: heading.html,
  visuallyHiddenText: headingVisuallyHiddenText,
  caption: heading.caption,
  size: heading.size,
  level: heading.level,
  classes: heading.classes,
  attributes: heading.attributes
}, {
  params: params,
  isCareCard: isCareCard
}, classNamesHeading) | trim }}
{% endmacro -%}

{%- macro _cardHeading(params, parent, classNamesHeading) %}
{% if params.text %}
{% call nhsukHeading({
  id: params.id,
  caption: params.caption,
  size: params.size,
  level: params.level | default(2),
  classes: params.classes,
  className: classNamesHeading,
  classPrefix: "nhsuk-heading-",
  attributes: params.attributes
}) %}
{% if params.text and parent.params.href and not "nhsuk-card--feature" in classNames %}
  <a class="nhsuk-card__link" href="{{ parent.params.href }}">
    {{- params.text | trim | indent(2) -}}
  </a>
{%- elif params.text and params.visuallyHiddenText %}
  <span role="text">
    <span class="nhsuk-u-visually-hidden">{{ params.visuallyHiddenText }}: </span>
    {{- params.text | trim | indent(4) }}
  </span>
{%- elif params.text %}
  {{ params.text | trim | indent(2) }}
{%- endif %}
{%- endcall %}
{% endif %}
{% if params.html %}
  {{- params.html | safe | trim }}
{% endif %}
{% if parent.isCareCard -%}
  <span class="nhsuk-card--care__arrow" aria-hidden="true"></span>
{% endif %}
{% endmacro -%}

<div class="{{ classNames }}" {%- if params.id %} id="{{ params.id }}"{% endif %}
  {{- nhsukAttributes(params.attributes) }}>
{% if image.html %}
  {{ image.html | safe | trim | indent(2) }}
{% elif image.src %}
  <img {{- nhsukAttributes({
    class: "nhsuk-card__img",
    src: image.src,
    alt: image.alt
  }) }}>
{% endif %}
{% if isCareCard or actions | length %}
  <div class="nhsuk-card__heading-container">
  {% if isCareCard %}
    {{ _careHeading(heading, {
      params: params,
      isCareCard: isCareCard
    }, classNamesHeading) | trim | indent(4) }}
  {% elif heading.text or heading.html %}
    {{ _cardHeading(heading, {
      params: params,
      isCareCard: isCareCard
    }, classNamesHeading) | trim | indent(4) }}
  {% endif %}
    {% if actions | length == 1 %}
    <div class="nhsuk-card__actions {%- if params.actions.classes %} {{ params.actions.classes }}{% endif %}">
      {{ nhsukCardAction(actions[0], {
        params: params
      }) | trim | indent(6) }}
    </div>
    {% elif actions | length %}
    <ul class="nhsuk-card__actions {%- if params.actions.classes %} {{ params.actions.classes }}{% endif %}">
      {% for action in actions %}
      <li class="nhsuk-card__action">
        {{ nhsukCardAction(action, {
          params: params
        }) | trim | indent(8) }}
      </li>
      {% endfor %}
    </ul>
  {% endif %}
  </div>
{% endif %}
  <div class="{{ "nhsuk-card__content" ~ (" " ~ description.classes if description.classes) }}"
    {{- nhsukAttributes(description.attributes) }}>
  {% if not isCareCard and not actions | length and (heading.text or heading.html) %}
    {{ _cardHeading(heading, {
      params: params,
      isCareCard: isCareCard
    }, classNamesHeading) | trim | indent(4) }}
  {% endif %}
  {% if caller %}
    {{- caller() }}
  {% elif description.html %}
    {{ description.html | safe | trim | indent(4) }}
  {% elif description.text %}
    <p class="nhsuk-card__description">
      {{- description.text | trim | indent(4) -}}
    </p>
  {% endif %}
  {% if "nhsuk-card--primary" in classNames %}
    {{ nhsukIcon("chevron-right-circle") | trim | indent(4) }}
  {% endif %}
  </div>
</div>
