////
/// (c) hidoo | MIT License
/// @group plugin/spritesheet
////

// stylelint max-nesting-depth: null

@use "sass:map";
@use "sass:meta";
@use "../../../../lib/mixin";
@use "../../../../settings";
@use "./set-properties" as _mixin;

/// Define responsive toggle item
/// @access private
/// @param {String} $name name of spritesheet item
/// @param {Map} $items [()] spritesheet items
/// @param {Map} $options [()] options
///
@mixin define-responsive-toggle-item($name, $items: (), $options: ()) {
  $breakpoints: ();

  // Filter breakpoints
  @each $bp, $query in settings.$breakpoints {
    @if meta.type-of($query) == "string" {
      $breakpoints: map.set($breakpoints, $bp, $query);
    }
  }

  @if map.has-key($items, $name) {
    $use2x: map.get($options, "use2x");

    &-#{$name} {
      $up: map.get($items, $name);

      @content;

      &::before {
        @include _mixin.set-properties(
          $values: $up,
          $options: map.merge(
              $options,
              (
                "use2x": $use2x == true
              )
            )
        );

        @each $bp, $query in $breakpoints {
          @if map.has-key($items, "#{$bp}_#{$name}") {
            $up-in-bp: map.get($items, "#{$bp}_#{$name}");

            @include mixin.media($query: $query) {
              @include _mixin.set-properties(
                $values: $up-in-bp,
                $options: map.merge(
                    $options,
                    (
                      "use2x": $use2x == $bp or $use2x == true,
                      "with-property": false
                    )
                  )
              );
            }
          }
        }
      }

      @if map.has-key($items, "#{$name}--focus") {
        $focus: map.get($items, "#{$name}--focus");

        @include mixin.has-focus() {
          &::before {
            @include _mixin.set-properties(
              $values: (
                "offset-x": map.get($focus, "offset-x"),
                "offset-y": map.get($focus, "offset-y")
              ),
              $options: map.merge(
                  $options,
                  (
                    "use2x": $use2x == true,
                    "with-property": false
                  )
                )
            );
          }
        }

        @each $bp, $query in settings.$breakpoints {
          @if map.has-key($items, "#{$bp}_#{$name}--focus") {
            @include mixin.media($query: $query) {
              $focus-in-bp: map.get($items, "#{$bp}_#{$name}--focus");

              @include mixin.has-focus() {
                &::before {
                  @include _mixin.set-properties(
                    $values: (
                      "offset-x": map.get($focus-in-bp, "offset-x"),
                      "offset-y": map.get($focus-in-bp, "offset-y")
                    ),
                    $options: map.merge(
                        $options,
                        (
                          "use2x": $use2x == $bp or $use2x == true,
                          "with-property": false
                        )
                      )
                  );
                }
              }
            }
          }
        }
      }

      @if map.has-key($items, "#{$name}--disabled") {
        $disabled: map.get($items, "#{$name}--disabled");

        @include mixin.has-disabled() {
          --field-opacity: 0;

          &::before {
            @include _mixin.set-properties(
              $values: (
                "offset-x": map.get($disabled, "offset-x"),
                "offset-y": map.get($disabled, "offset-y")
              ),
              $options: map.merge(
                  $options,
                  (
                    "use2x": $use2x == true,
                    "with-property": false
                  )
                )
            );
          }
        }

        @each $bp, $query in settings.$breakpoints {
          @if map.has-key($items, "#{$bp}_#{$name}--disabled") {
            @include mixin.media($query: $query) {
              $disabled-in-bp: map.get($items, "#{$bp}_#{$name}--disabled");

              @include mixin.has-disabled() {
                &::before {
                  @include _mixin.set-properties(
                    $values: (
                      "offset-x": map.get($disabled-in-bp, "offset-x"),
                      "offset-y": map.get($disabled-in-bp, "offset-y")
                    ),
                    $options: map.merge(
                        $options,
                        (
                          "use2x": $use2x == $bp or $use2x == true,
                          "with-property": false
                        )
                      )
                  );
                }
              }
            }
          }
        }
      }

      @if map.has-key($items, "#{$name}--selected") {
        $selected: map.get($items, "#{$name}--selected");

        @include mixin.has-selected() {
          &::before {
            @include _mixin.set-properties(
              $values: (
                "offset-x": map.get($selected, "offset-x"),
                "offset-y": map.get($selected, "offset-y")
              ),
              $options: map.merge(
                  $options,
                  (
                    "use2x": $use2x == true,
                    "with-property": false
                  )
                )
            );
          }
        }

        @each $bp, $query in settings.$breakpoints {
          @if map.has-key($items, "#{$bp}_#{$name}--selected") {
            @include mixin.media($query: $query) {
              $selected-in-bp: map.get($items, "#{$bp}_#{$name}--selected");

              @include mixin.has-selected() {
                &::before {
                  @include _mixin.set-properties(
                    $values: (
                      "offset-x": map.get($selected-in-bp, "offset-x"),
                      "offset-y": map.get($selected-in-bp, "offset-y")
                    ),
                    $options: map.merge(
                        $options,
                        (
                          "use2x": $use2x == $bp or $use2x == true,
                          "with-property": false
                        )
                      )
                  );
                }
              }
            }
          }
        }

        @if map.has-key($items, "#{$name}--selected--focus") {
          $selected-focus: map.get($items, "#{$name}--selected--focus");

          @include mixin.has-selected() {
            @include mixin.has-focus() {
              &::before {
                @include _mixin.set-properties(
                  $values: (
                    "offset-x": map.get($selected-focus, "offset-x"),
                    "offset-y": map.get($selected-focus, "offset-y")
                  ),
                  $options: map.merge(
                      $options,
                      (
                        "use2x": $use2x == true,
                        "with-property": false
                      )
                    )
                );
              }
            }
          }

          @each $bp, $query in settings.$breakpoints {
            @if map.has-key($items, "#{$bp}_#{$name}--selected--focus") {
              @include mixin.media($query: $query) {
                $selected-focus-in-bp: map.get(
                  $items,
                  "#{$bp}_#{$name}--selected--focus"
                );

                @include mixin.has-selected() {
                  @include mixin.has-focus() {
                    // stylelint-disable max-nesting-depth
                    &::before {
                      @include _mixin.set-properties(
                        $values: (
                          "offset-x": map.get($selected-focus-in-bp, "offset-x"),
                          "offset-y": map.get($selected-focus-in-bp, "offset-y")
                        ),
                        $options: map.merge(
                            $options,
                            (
                              "use2x": $use2x == $bp or $use2x == true,
                              "with-property": false
                            )
                          )
                      );
                    }
                    // stylelint-enable max-nesting-depth
                  }
                }
              }
            }
          }
        }

        @if map.has-key($items, "#{$name}--selected--disabled") {
          $selected-disabled: map.get($items, "#{$name}--selected--disabled");

          @include mixin.has-selected() {
            @include mixin.has-disabled() {
              --field-opacity: 0;

              // stylelint-disable max-nesting-depth
              &::before {
                @include _mixin.set-properties(
                  $values: (
                    "offset-x": map.get($selected-disabled, "offset-x"),
                    "offset-y": map.get($selected-disabled, "offset-y")
                  ),
                  $options: map.merge(
                      $options,
                      (
                        "use2x": $use2x == true,
                        "with-property": false
                      )
                    )
                );
              }
              // stylelint-enable max-nesting-depth
            }
          }

          @each $bp, $query in settings.$breakpoints {
            @if map.has-key($items, "#{$bp}_#{$name}--selected--disabled") {
              @include mixin.media($query: $query) {
                $selected-disabled-in-bp: map.get(
                  $items,
                  "#{$bp}_#{$name}--selected--disabled"
                );

                @include mixin.has-selected() {
                  @include mixin.has-disabled() {
                    // stylelint-disable max-nesting-depth
                    &::before {
                      @include _mixin.set-properties(
                        $values: (
                          "offset-x": map.get(
                              $selected-disabled-in-bp,
                              "offset-x"
                            ),
                          "offset-y": map.get(
                              $selected-disabled-in-bp,
                              "offset-y"
                            )
                        ),
                        $options: map.merge(
                            $options,
                            (
                              "use2x": $use2x == $bp or $use2x == true,
                              "with-property": false
                            )
                          )
                      );
                    }
                    // stylelint-enable max-nesting-depth
                  }
                }
              }
            }
          }
        }
      }
    }
  } @else {
    // stylelint-disable-next-line max-line-length
    @warn "@mixin define-responsive-toggle-item: Spritesheet '#{$name}' was not generate, because $name: '#{$name}' is not found.";
  }
}
