$hu-margin-core-modules: hu-format-modules(hu-get-class-modules($hu-margin-modules, core, $hu-margin-modules));
$hu-margin-pseudos: hu-get-class-modules($hu-margin-modules, pseudos, null);
$hu-margin-parents: hu-get-class-modules($hu-margin-modules, parents, null);

@each $module in $hu-margin-core-modules {
  @each $scale, $value in $hu-margin-scale {
    @each $type, $properties in $hu-margin-types {
      $class-name: hu-class-name("#{$type}:#{$scale}");
      $class-name-negative: hu-class-name("#{$type}:-#{$scale}");
      $value: if($value, $value, $scale);

      @include hu-generic($class-name, $module) {
        @each $property in $properties {
          #{$property}: $value #{hu-important()};
        }
      }

      @if (type-of($value) == number and $value > 0) {
        @include hu-generic($class-name-negative, $module) {
          @each $property in $properties {
            #{$property}: $value * -1;
          }
        }
      }
    }
  }
}

@if (index($hu-margin-core-modules, responsive)) {
  @each $mq-scale, $mq-value in $hu-media-queries {
    @include hu-media-query($mq-value) {
      @each $scale, $value in $hu-margin-scale {
        @each $type, $properties in $hu-margin-types {
          $class-name: hu-class-name("#{$type}:#{$scale}");
          $class-name-negative: hu-class-name("#{$type}:-#{$scale}");
          $value: if($value, $value, $scale);

          @include hu-responsive($class-name, $hu-margin-core-modules, $mq-scale) {
            @each $property in $properties {
              #{$property}: $value #{hu-important()};
            }
          }

          @if (type-of($value) == number and $value > 0) {
            @include hu-responsive($class-name-negative, $hu-margin-core-modules, $mq-scale) {
              @each $property in $properties {
                #{$property}: $value * -1;
              }
            }
          }
        }
      }
    }
  }
}

@if ($hu-margin-pseudos) {
  @each $module in $hu-margin-core-modules {
    @each $scale, $value in $hu-margin-scale {
      @each $type, $properties in $hu-margin-types {
        $class-name: hu-class-name("#{$type}:#{$scale}");
        $class-name-negative: hu-class-name("#{$type}:-#{$scale}");
        $value: if($value, $value, $scale);

        @include hu-pseudo($class-name, $hu-margin-pseudos, $module) {
          @each $property in $properties {
            #{$property}: $value #{hu-important()};
          }
        }

        @if (type-of($value) == number and $value > 0) {
          @include hu-pseudo($class-name-negative, $hu-margin-pseudos, $module) {
            @each $property in $properties {
              #{$property}: $value * -1;
            }
          }
        }
      }
    }
  }

  @if (index($hu-margin-core-modules, responsive)) {
    @each $mq-scale, $mq-value in $hu-media-queries {
      @include hu-media-query($mq-value) {
        @each $scale, $value in $hu-margin-scale {
          @each $type, $properties in $hu-margin-types {
            $class-name: hu-class-name("#{$type}:#{$scale}");
            $class-name-negative: hu-class-name("#{$type}:-#{$scale}");
            $value: if($value, $value, $scale);

            @include hu-pseudo-responsive($class-name, $hu-margin-pseudos, $hu-margin-core-modules, $mq-scale) {
              @each $property in $properties {
                #{$property}: $value #{hu-important()};
              }
            }

            @if (type-of($value) == number and $value > 0) {
              @include hu-pseudo-responsive($class-name-negative, $hu-margin-pseudos, $hu-margin-core-modules, $mq-scale) {
                @each $property in $properties {
                  #{$property}: $value * -1;
                }
              }
            }
          }
        }
      }
    }
  }
}

@if ($hu-margin-parents) {
  @each $module in $hu-margin-core-modules {
    @each $scale, $value in $hu-margin-scale {
      @each $type, $properties in $hu-margin-types {
        $class-name: hu-class-name("#{$type}:#{$scale}");
        $class-name-negative: hu-class-name("#{$type}:-#{$scale}");
        $value: if($value, $value, $scale);

        @include hu-parent($class-name, $hu-margin-parents, $module) {
          @each $property in $properties {
            #{$property}: $value #{hu-important()};
          }
        }

        @if (type-of($value) == number and $value > 0) {
          @include hu-parent($class-name-negative, $hu-margin-parents, $module) {
            @each $property in $properties {
              #{$property}: $value * -1;
            }
          }
        }
      }
    }
  }

  @if (index($hu-margin-core-modules, responsive)) {
    @each $mq-scale, $mq-value in $hu-media-queries {
      @include hu-media-query($mq-value) {
        @each $scale, $value in $hu-margin-scale {
          @each $type, $properties in $hu-margin-types {
            $class-name: hu-class-name("#{$type}:#{$scale}");
            $class-name-negative: hu-class-name("#{$type}:-#{$scale}");
            $value: if($value, $value, $scale);

            @include hu-parent-responsive($class-name, $hu-margin-parents, $hu-margin-core-modules, $mq-scale) {
              @each $property in $properties {
                #{$property}: $value #{hu-important()};
              }
            }

            @if (type-of($value) == number and $value > 0) {
              @include hu-parent-responsive($class-name-negative, $hu-margin-parents, $hu-margin-core-modules, $mq-scale) {
                @each $property in $properties {
                  #{$property}: $value * -1;
                }
              }
            }
          }
        }
      }
    }
  }
}
