////////////////////////
// Default the Breakpoints variable
////////////////////////
$breakpoints: () !default;
$BREAKPOINTS: () !default;

////////////////////////
// Respond-to API Mixin
////////////////////////
@mixin respond-to($context, $no-query: false) {
  @if length($breakpoints) > 0 and length($BREAKPOINTS) == 0 {
    @warn "In order to avoid variable namespace collisions, we have updated the way to add breakpoints for respond-to. Please change all instances of `$breakpoints: add-breakpoint()` to `@include add-breakpoint()`. The `add-breakpoint()` function will be deprecated in a future release.";
    $BREAKPOINTS: $breakpoints !global;
    $breakpoints: () !global;
  }

  @if type-of($BREAKPOINTS) != 'map' {
    // Just in case someone writes gibberish to the $breakpoints variable.
    @warn "Your breakpoints aren't a map! `respond-to` expects a map. Please check the value of $BREAKPOINTS variable.";
    @content;
  }
  @else if map-has-key($BREAKPOINTS, $context) {
    @include breakpoint(map-get($BREAKPOINTS, $context), $no-query) {
      @content;
    }
  }
  @else if not map-has-key($BREAKPOINTS, $context) {
    @warn "`#{$context}` isn't a defined breakpoint! Please add it using `$breakpoints: add-breakpoint(`#{$context}`, $value);`";
    @content;
  }
  @else {
    @warn "You haven't created any breakpoints yet! Make some already! `@include add-breakpoint($name, $bkpt)`";
    @content;
  }
}

//////////////////////////////
// Add Breakpoint to Breakpoints
// TODO: Remove function in next release
//////////////////////////////
@function add-breakpoint($name, $bkpt, $overwrite: false) {
  $output: ($name: $bkpt);

  @if length($breakpoints) == 0 {
    @return $output;
  }
  @else {
    @if map-has-key($breakpoints, $name) and $overwrite != true {
      @warn "You already have a breakpoint named `#{$name}`, please choose another breakpoint name, or pass in `$overwrite: true` to overwrite the previous breakpoint.";
      @return $breakpoints;
    }
    @else if not map-has-key($breakpoints, $name) or $overwrite == true {
      @return map-merge($breakpoints, $output);
    }
  }
}

@mixin add-breakpoint($name, $bkpt, $overwrite: false) {
  $output: ($name: $bkpt);

  @if length($BREAKPOINTS) == 0 {
    $BREAKPOINTS: $output !global;
  }
  @else {
    @if map-has-key($BREAKPOINTS, $name) and $overwrite != true {
      @warn "You already have a breakpoint named `#{$name}`, please choose another breakpoint name, or pass in `$overwrite: true` to overwrite the previous breakpoint.";
      $BREAKPOINTS: $BREAKPOINTS !global;
    }
    @else if not map-has-key($BREAKPOINTS, $name) or $overwrite == true {
      $BREAKPOINTS: map-merge($BREAKPOINTS, $output) !global;
    }
  }
}

@function get-breakpoint($name: false) {
  @if $name == false {
    @return $BREAKPOINTS;
  }
  @else {
    @return map-get($BREAKPOINTS, $name);
  }
}