{% set COLUMN_CLASS_NAMES = {
  xs: 12,
  sm: 0,
  md: 0,
  lg: 0,
  xl: 0,
  xxl: 0,
  xxxl: 0
} %}

{% set GRID_DEFAULTS = {
  _templateClass: 'grid',
  _templateTag: 'div',
  className: '',
  itemClassName: '',
  column: COLUMN_CLASS_NAMES,
  count: 6,
  item: false
} %}

{#
  Helper for generating column classes
  @param {string} baseClass - base class for creating modifiers
  @param {object} columm - columns object for creating corresponded column modifiers
#}
{% macro _getColumnClassNames(baseClass = 'grid-column', column = {}) %}
  {% set column = merge(COLUMN_CLASS_NAMES, column) %}
  {% set classNames = [
    baseClass + '--xs-' + column.xs if column.xs,
    baseClass + '--sm-' + column.sm if column.sm,
    baseClass + '--md-' + column.md if column.md,
    baseClass + '--lg-' + column.lg if column.lg,
    baseClass + '--xl-' + column.xl if column.xl,
    baseClass + '--xxl-' + column.xxl if column.xxl,
    baseClass + '--xxxl-' + column.xxxl if column.xxxl
  ] %}

  {{ setClass(classNames) }}
{% endmacro %}

{#
Grid component
@param {object} settings - grid settings
#}
{% macro Grid(settings = {}) %}
  {% set settings = merge(GRID_DEFAULTS, settings) %}
  {% set baseClass = settings._templateClass %}
  {% set itemBaseClass = 'grid-column' %}
  {% set classNames = [baseClass, settings.className] %}
  {% set itemClassNames = [
    itemBaseClass,
    settings.itemClassName,
    _getColumnClassNames(itemBaseClass, settings.column)
  ] %}

  {% set container = settings._templateTag %}
  {% set child = 'li' if container === 'ul' else 'div' %}

  <{{ container }} class="{{ setClass(classNames) }}" {{ Helpers.setAttributes(settings.attrs) }}>
  {% if caller %}
    {{ caller() }}
  {% else %}
    {% for item in range(settings.count) %}
      <{{ child }} class="{{ setClass(itemClassNames) }}">
        {{ settings.item | safe }}
      </{{ child }}>
    {% endfor %}
  {% endif %}
  </{{ container }}>
{% endmacro %}

{% set GRID_COLUMN_DEFAULTS = {
  _templateClass: 'grid',
  _templateTag: 'div',
  className: '',
  xs: '',
  sm: '',
  md: '',
  lg: '',
  xl: '',
  xxl: '',
  xxxl: ''
} %}

{#
  GridColumn component
  @param {object} settings - grid column settings
#}
{% macro GridColumn(settings = {}) %}
  {% set settings = merge(GRID_COLUMN_DEFAULTS, settings) %}
  {% set columnClass = 'grid-column' %}
  {% set classNames = [
    columnClass,
    settings.className,
    _getColumnClassNames(columnClass, settings)
  ] %}

  <{{ settings._templateTag }} class="{{ setClass(classNames) }}">
    {{ caller() }}
  </{{ settings._templateTag }}>
{% endmacro %}


{% set GRID_MULTICOLUMN_LAYOUT_DEFAULTS = merge(
  GRID_DEFAULTS,
  { cols: [merge(GRID_COLUMN_DEFAULTS, { component: '' })] }
) %}

{% macro GridMulticolumnLayout(settings = {}) %}
  {% set settings = merge(GRID_MULTICOLUMN_LAYOUT_DEFAULTS, settings) %}

  {% call Grid(settings) %}
    {% for col in settings.cols %}
      {% call GridColumn(col) %}
        {{ col.component }}
      {% endcall %}
    {% endfor %}
  {% endcall %}
{% endmacro %}
