/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */

@use 'sass:list';
@use 'sass:map';
@use '@material/switch/switch-theme' as mdc-switch-theme;
@use '@material/theme/keys';
@use '@material/theme/map-ext';
@use '@material/theme/state';
@use '@material/theme/theme';
@use '@material/mwc-ripple/ripple-theme';

@forward '@material/switch/switch-theme' show
  $forced-colors-theme,
  $light-theme,
  density;

@mixin theme($theme) {
  @include mdc-switch-theme.theme($theme);
}

@mixin theme-styles($theme) {
  @include theme.validate-theme(mdc-switch-theme.$light-theme, $theme);

  $pair: map-ext.split(
    $theme,
    selected-focus-state-layer-color,
    selected-focus-state-layer-opacity,
    selected-hover-state-layer-color,
    selected-hover-state-layer-opacity,
    selected-pressed-state-layer-color,
    selected-pressed-state-layer-opacity,
    unselected-focus-state-layer-color,
    unselected-focus-state-layer-opacity,
    unselected-hover-state-layer-color,
    unselected-hover-state-layer-opacity,
    unselected-pressed-state-layer-color,
    unselected-pressed-state-layer-opacity
  );

  $theme-without-ripple: list.nth($pair, 1);
  @include mdc-switch-theme.theme-styles($theme-without-ripple);

  $ripple-theme: list.nth($pair, 2);
  $ripple-theme: keys.create-theme-properties($ripple-theme, switch);
  @include state.selected(mdc-switch-theme.$selectors) {
    @include ripple-theme.theme(
      (
        focus-state-layer-color:
          map.get($ripple-theme, selected-focus-state-layer-color),
        focus-state-layer-opacity:
          map.get($ripple-theme, selected-focus-state-layer-opacity),
        hover-state-layer-color:
          map.get($ripple-theme, selected-hover-state-layer-color),
        hover-state-layer-opacity:
          map.get($ripple-theme, selected-hover-state-layer-opacity),
        pressed-state-layer-color:
          map.get($ripple-theme, selected-pressed-state-layer-color),
        pressed-state-layer-opacity:
          map.get($ripple-theme, selected-pressed-state-layer-opacity),
      )
    );

    // TODO(b/191298796): ripple-theme does not currently support setting
    // state layer colors other than hover. Remove this section when bug is
    // resolved.
    @include state.focus(mdc-switch-theme.$selectors) {
      @include ripple-theme.theme(
        (
          hover-state-layer-color:
            map.get($ripple-theme, selected-focus-state-layer-color),
        )
      );
    }
    @include state.pressed(mdc-switch-theme.$selectors) {
      @include ripple-theme.theme(
        (
          hover-state-layer-color:
            map.get($ripple-theme, selected-pressed-state-layer-color),
        )
      );
    }
  }

  @include state.unselected(mdc-switch-theme.$selectors) {
    @include ripple-theme.theme(
      (
        focus-state-layer-color:
          map.get($ripple-theme, unselected-focus-state-layer-color),
        focus-state-layer-opacity:
          map.get($ripple-theme, unselected-focus-state-layer-opacity),
        hover-state-layer-color:
          map.get($ripple-theme, unselected-hover-state-layer-color),
        hover-state-layer-opacity:
          map.get($ripple-theme, unselected-hover-state-layer-opacity),
        pressed-state-layer-color:
          map.get($ripple-theme, unselected-pressed-state-layer-color),
        pressed-state-layer-opacity:
          map.get($ripple-theme, unselected-pressed-state-layer-opacity),
      )
    );

    // TODO(b/191298796): ripple-theme does not currently support setting
    // state layer colors other than hover. Remove this section when bug is
    // resolved.
    @include state.focus(mdc-switch-theme.$selectors) {
      @include ripple-theme.theme(
        (
          hover-state-layer-color:
            map.get($ripple-theme, unselected-focus-state-layer-color),
        )
      );
    }
    @include state.pressed(mdc-switch-theme.$selectors) {
      @include ripple-theme.theme(
        (
          hover-state-layer-color:
            map.get($ripple-theme, unselected-pressed-state-layer-color),
        )
      );
    }
  }
}
