// grid generator
@mixin grid-generator($option) {
  $_options: merge-objects($_defaults, $option) !global;
  $row-class: greedy-options('row-class');
  $column-class: greedy-options('column-class');

  @if length(greedy-options('sizes')) == 0 {
    $_: log('length of sizes cannot be zero.');
  }

  // check if grid-wrapper-class is provided
  @if is-enabled('grid-wrapper-class') {
    $row-class: '#{greedy-options('grid-wrapper-class')} .#{greedy-options('row-class')}';
    $column-class: '#{greedy-options('grid-wrapper-class')} .#{greedy-options('column-class')}';
  }

  @if is-enabled('row-class') {
    // row element styles
    .#{$row-class} {
      @if is-enabled('gutter') {
        margin-left: -#{greedy-options('gutter') / 2};
        margin-right: -#{greedy-options('gutter') / 2};
      }
      
      display: flex;
      flex-wrap: wrap;
    }
  }
  
  @if is-enabled('column-class') {
    // column element styles
    .#{$column-class} {
      @if is-enabled('gutter') {
        padding-left: #{greedy-options('gutter') / 2};
        padding-right: #{greedy-options('gutter') / 2};
      }
    
      flex-basis: 0;
      flex-grow: 1;
      flex-shrink: 1;
    }
  }
  
  // run custom row mixins if it does exist and injections are active
  @if is-enabled('injections', 'greedy-custom-row-mixins') {
    @include greedy-custom-row-mixins();
  }
  
  // generate columns for each sizes
  @each $size in greedy-options('sizes') {
    $size-name: $size;
    $breakpoint: null;
    
    // generate columns if the size has breakpoint for responsiveness by using include-media
    @if type-of($size-name) == map {
      $size-name: map-get($size, 'name');
      $breakpoint: map-get($size, 'breakpoint');
      
      @include media($breakpoint...) {
        @include column-generator($size-name);

        // run custom size mixins if it does exist and injections are active
        @if is-enabled('injections', 'greedy-custom-size-mixins') {
          @include greedy-custom-size-mixins($size-name, $breakpoint);
        }
      }
    } @else {
      @include column-generator($size-name);
    }
  }

  // reset internal option variable
  $_options: null;
}
