@import '../functions/power';

$values: (1 -  $spacing-offset-default-size: 0);
$spacings: (default: null);
@each $name, $scale in $scales {
  $map: (1 -  $spacing-offset-default-size: 0);
  $spacings: map_merge($spacings, ($name: $map));
}


@mixin spacings($ratio, $base, $set-vars: true) {
  @for $i from 1 through $spacing-num {
    $n: $i -  $spacing-offset-default-size;

    $size: $base * power($ratio, $n);
    @if $size < $spacing-min {
      $size: $spacing-min;
    }

    $values: map_merge($values, ($n: $size)) !global;

    @if $set-vars{
      @if $n < 0 {
        --spacing-m#{abs($n)}: #{$size};
      }
      @else if $n == 0 {
        --spacing-#{$n}: #{$size};
      }
      @else {
        --spacing-p#{$n}: #{$size};
      }
    }
  }
}


@mixin define-spacing-variables($set-vars: true) {
  @each $name, $scale in $scales {
    $base: map-get($scale, font-base) * power(map-get($scale, font-ratio), $spacing-font-size-origin); //calculate base spacing from largest font-size (h1)

    $ratio: map-get($scale, spacing-ratio);
    $bp: map-get($scale, bp);
    $side-padding: map-get($scale, side-padding);

    @if $bp == 0 {
      :root {
        @include spacings($ratio, $base, $set-vars);
        --spacing-side: #{spacing($side-padding)};
      }
    }
    @else {
      :root {
        @media screen and (min-width: $bp) {
          @include spacings($ratio, $base, $set-vars);
          --spacing-side: #{spacing($side-padding)};
        }
      }
    }

    .view--#{$name} {
      @include spacings($ratio, $base, $set-vars);
      font-size: var(--font-size-0);
    }

    $spacings: map_merge($spacings, ($name: $values)) !global;
  }
}


@function spacing($size, $times: null, $add: null, $subtract: null, $divideby: null) {

  $spacing: null;
  @if $size == "side" {
    $spacing: var(--spacing-side);
  }
  @else {
    //check if requested spacing size is within range
    $max-size: $spacing-num - $spacing-offset-default-size;
    $min-size: ($spacing-offset-default-size - 1) * -1;
    @if $size < $min-size or $size > $max-size {
      @error "Requested spacing-size is out of range. Must be between " + $min-size + " and " + $max-size;
    }

    @if $size < 0 {
      $spacing: var(--spacing-m#{abs($size)});
    }
    @else if $size == 0 {
      $spacing: var(--spacing-#{$size});
    }
    @else {
      $spacing: var(--spacing-p#{$size});
    }
  }

  //do some math - first multiply
  $calc: null;
  @if $times != null {
    $calc: "#{$spacing} * #{$times}";
  }
  @else {
    $calc: #{$spacing};
  }
  //do some math - then add
  @if $add != null {
    $calc: "#{$calc} + #{$add}";
  }
  //do some math - then subtract
  @if $subtract != null {
    $calc: "#{$calc} - (#{$subtract})"; //in partentheses to subtract sum if $subtract contains an expression with two value added together
  }
  //do some math - lastly devide
  @if $divideby != null {
    $calc: "(#{$calc}) / (#{$divideby})";
  }

  //if math has been added return as css calc-value, else return as css-variable
  @if $calc != $spacing {
    @return calc(#{$calc});
  }
  @else {
    @return $spacing;
  }
}
