@use "sass:map";

$breakpoint-names: map-get($settings, "breakpointNames");
$breakpoint-sizes: map-get($settings, "breakpointSizes");

$breakpoints: ();

@for $i from 1 through length($breakpoint-names) {
  $breakpoints: map-set(
    $breakpoints,
    nth($breakpoint-names, $i),
    nth($breakpoint-sizes, $i)
  );
}

@function breakpoint-exists($name) {
  $bp: map.get($breakpoints, $name);
  @if $bp {
    @if $bp > -1 {
      @return true;
    } @else {
      @return false;
    }
  } @else {
    @return false;
  }
}

@function get-breakpoint($name) {
  @if breakpoint-exists($name) {
    @return map.get($breakpoints, $name);
  } @else {
    @warn "#{$name} does not exist in breakpoints";
  }
}

@function get-next-breakpoint($name) {
  $index: map-index($breakpoints, $name);
  $index: $index + 2;
  @if $index > length($breakpoints) {
    @return 9999;
  }
  $next-name: nth(nth($breakpoints, $index), 1);

  @if breakpoint-exists($next-name) {
    @return map.get($breakpoints, $next-name);
  } @else {
    @return 9999;
  }
}

@function breakpoint($name, $target: "only") {
  @if breakpoint-exists($name) {
    @if $target == "up" {
      @return "screen and (min-width: #{get-breakpoint($name)}px)";
    }
    @if $target == "down" {
      @return "screen and (max-width: #{get-next-breakpoint($name)}px)";
    }
    @if $target == "only" {
      @return "screen and (min-width: #{get-breakpoint($name)}px) and (max-width: #{get-next-breakpoint($name)}px)";
    }
  } @else {
    @warn "#{$name} does not exist in breakpoints";
  }
  @return "";
}

@function bp($name, $target: "only") {
  @return breakpoint($name, $target);
}

@mixin breakpoint($name, $target: "only") {
  @media #{breakpoint($name,$target)} {
    @content;
  }
}
@mixin bp($name, $target: "only") {
  @include breakpoint($name, $target) {
    @content;
  }
}
