////
/// Link Tool : build
/// @group link
////

@mixin _link-class($base, $size: md, $place: null, $align-on-content: false, $append: '') {
  $selector: '';
  $base: '#{$base}';

  @if $size != md {
    $selector: '#{$base}--#{$size}';
  }

  @if $align-on-content {
    $selector: '#{$selector}#{$base}--align-on-content';
  }

  @if $place == only {
    @if $selector == '' {
      $selector: '#{$base}';
    }
    $selector: '#{$selector}:not([class*="#{str-slice($base, 2)}--icon-"])';
  }
  @else if $place == left or $place == right {
    $selector: '#{$selector}#{$base}--icon-#{$place}';
  }

  @if $selector == '' {
    $selector: $base;
  }

  @if $append != '' {
    $selector: '#{$selector} #{$append}';
  }

  #{$selector} {
    @if $place != null {
      @include has-icon {
        @content;
      }
    }
    @else {
      @content;
    }
  }
}

@mixin _build-link-base {
  @include set-text-margin(0);
  @include set-title-margin(0);
}

@mixin _link-display($display) {
  @if $display == flex {
    @include display-flex(row, center, null, null, true);
    width: -moz-fit-content;
    width: fit-content;
    @include _pseudo(before after) {
      display: block;
    }
  }
  @else {
    display: inline;
  }
}

@mixin _build-link($settings) {
  $places: map_get($settings, places);
  $sizes: _link-sort-sizes(map_get($settings, sizes));
  $border-radius: map-get($settings, border-radius);
  $align-on-content: map-get($settings, align-on-content);
  $base: ns(map-get($settings, selector));
  $underline: map-get($settings, underline);
  $append: map-get($settings, append);

  #{$base} {
    @include _build-link-base;
    @include _link-display(map-get($settings, display));

    @if $underline != true {
      @include disable-underline;
      @include tint-enabled(true, null);
    }
    @content;
  }

  @if map_get($settings, no-modifier) != true {
    @each $size, $size-settings in $sizes {
      @include _link-class($base, $size, null, false, $append) {
        @include _build-link-size($size-settings, $border-radius);

        @if map_get($settings, blank) {
          @include target-blank(true) {
            @include _build-link-icon($size-settings, right, $size, false);
          }
        }
      }

      @if $align-on-content {
        @include _link-class($base, $size, null, true, $append) {
          @include _link-align-on-content($size, null, $size-settings);
        }
      }

      @if $places != null {
        @each $place in $places {
          @include _link-class($base, $size, $place, false, $append) {
            @include _build-link-icon($size-settings, $place, $size, true);
          }

          @if $align-on-content {
            @include _link-class($base, $size, $place, true, $append) {
              @include _link-align-on-content($size, $place, $size-settings);
            }
          }
        }

        @if index($places, only) == null {
          @include _link-class($base, $size, only, false, $append) {
            @include before(none);
          }
        }
      }
    }
  }
}

@mixin build-link() {
  @include _build-link($links-settings) {
    @content;
  }
}
