////
/// Core Tool : Grid
/// @group core
////

/// Génère les classes de colonne pour la grille ainsi que les offsets (optionnel)
///
/// @param {Map} $columns [$grid-settings] - configuration de la grille
/// @param {Bool} $with-container [true] - si true, définit les containers
/// @param {Bool} $with-offsets [true] - si true, définit les offsets
///
/// @require {variable} $grid-columns
///
/// @example scss - Génère les colonnes
///   @include grid-generator();
@mixin grid($settings: $grid-settings, $with-container: true, $with-offsets: true) {
  $columns: map-get($settings, columns);
  $breakpoints-settings: map-get($grid-settings, breakpoints);
  $last-gutter: 0;
  $last-max-width: null;
  $containers: ();
  $row-gutters: ();

  @each $breakpoint, $limits in $breakpoints {
    $mod: '-#{$breakpoint}';

    @if $breakpoint == xs {
      $breakpoint: first;
      $mod: '';
    }

    @include respond-from($breakpoint) {
      $breakpoint-settings: map-get($breakpoints-settings, $breakpoint);
      $gutter: null;
      $max-width: null;

      @if $breakpoint-settings != null {
        $gutter: map-get($breakpoint-settings, gutter);
        $max-width: map-get($breakpoint-settings, max-width);

        @if $gutter != null {
          $last-gutter: $gutter;
        }

        @if $max-width != null {
          $last-max-width: $max-width;
        }
      }

      // Container
      @if $with-container {

        $container: ns('container' + $mod);

        @if length($containers) > 0 {
          #{$containers} {
            @if $gutter != null {
              @include padding-x($gutter * 2);
            }

            @if $max-width != null {
              @include max-size($max-width + $last-gutter * 4);
            }
          }
        }

        $containers: append($containers, $container, 'comma');

        #{$container} {
          @if $last-gutter != 0 {
            @include padding-x($last-gutter * 2);
          }

          @if $last-max-width != null {
            @include max-size($last-max-width + $last-gutter * 4);
          }
        }

        #{ns('container' + $mod + '--fluid')} {
          @include padding-x(0);
          @include max-size(none);
          overflow: hidden;
        }
      }

      // Gutters
      $row-gutter: ns(grid-row#{$mod}--gutters);
      $g: $last-gutter;

      @if $gutter != null {
        $g: $gutter;
        @if length($row-gutters) > 0 {
          #{$row-gutters} {
            @include margin(-$g);

            > {
              #{class-start-with(ns(col-, ''))},
              #{ns(col)} {
                @include padding($g);
              }
            }
          }
        }
      }

      #{$row-gutter} {
        @include margin(-$g);

        > {
          #{class-start-with(ns(col-, ''))},
          #{ns(col)} {
            @include padding($g);
          }
        }
      }

      $row-gutters: append($row-gutters, $row-gutter, 'comma');

      #{ns(grid-row + $mod + --no-gutters)} {
        @include margin(0);

        > {
          #{class-start-with(ns(col-, ''))},
          #{ns(col)} {
            @include padding(0);
          }
        }
      }

      // Cols
      #{ns('col' + $mod)} {
        flex: 1;
      }

      @for $i from 1 through $columns {
        $append: '#{$mod}-#{$i}';
        #{ns('col' + $append)} {
          @include grid-col($i, $columns);
        }

        @if $with-offsets {
          #{ns('col-offset' + $append)} {
            @include grid-col-offset($i, $columns);
          }
        }
      }
    }
  }
}
