@use "sass:map";
@use "sass:meta";
@use "public-color-util";
@use "variables";

// Utility mixins for the public

// colors
// ------
@function mat-css-color(
  $hue: 500,
  $opacity: null,
  $palette: "primary",
  $is-contrast-color: false
) {
  // If opacity is being provided, we need to to use *-no-rgb pallets
  // in order to return a proper variable value.
  @if ($opacity != null) {
    @return _mat-css-color-no-rgb($hue, $opacity, $palette, $is-contrast-color);
  }
  $palette_: variables.$palette-primary;
  @if ($is-contrast-color == true) {
    @if ($palette== "primary") {
      $palette_: variables.$contrast-palette;
    } @else if ($palette== "accent") {
      $palette_: variables.$contrast-palette-accent;
    } @else if ($palette== "warn") {
      $palette_: variables.$contrast-palette-warn;
    } @else {
      @error "Invalid contrast palette";
    }
  } @else {
    @if ($palette== "primary") {
      $palette_: variables.$palette-primary;
    } @else if ($palette== "accent") {
      $palette_: variables.$palette-accent;
    } @else if ($palette== "warn") {
      $palette_: variables.$palette-warn;
    } @else {
      @error "Invalid palette";
    }
  }

  $color: map.get($palette_, $hue);

  @if (meta.type-of($opacity) == number) {
    @return rgba($color, $opacity);
  } @else {
    @return $color;
  }
}

@function _mat-css-color-no-rgb(
  $hue: 500,
  $opacity: null,
  $palette: "primary",
  $is-contrast-color: false
) {
  $palette_: variables.$palette-primary-no-rgb;
  @if ($is-contrast-color == true) {
    @if ($palette== "primary") {
      $palette_: variables.$contrast-palette-no-rgb;
    } @else if ($palette== "accent") {
      $palette_: variables.$contrast-palette-accent-no-rgb;
    } @else if ($palette== "warn") {
      $palette_: variables.$contrast-palette-warn-no-rgb;
    } @else {
      @error "Invalid contrast palette";
    }
  } @else {
    @if ($palette== "primary") {
      $palette_: variables.$palette-primary-no-rgb;
    } @else if ($palette== "accent") {
      $palette_: variables.$palette-accent-no-rgb;
    } @else if ($palette== "warn") {
      $palette_: variables.$palette-warn-no-rgb;
    } @else {
      @error "Invalid palette";
    }
  }
  $var: map.get($palette_, $hue);
  @return #{rgba($var, $opacity)};
}

@function mat-css-color-primary($hue: 500, $opacity: null) {
  @return mat-css-color($hue, $opacity, "primary");
}

@function mat-css-color-accent($hue: 500, $opacity: null) {
  @return mat-css-color($hue, $opacity, "accent");
}

@function mat-css-color-warn($hue: 500, $opacity: null) {
  @return mat-css-color($hue, $opacity, "warn");
}

// contrast-colors
// ---------------
@function mat-css-contrast-color(
  $hue: 500,
  $opacity: null,
  $palette: "primary"
) {
  @return mat-css-color($hue, $opacity, $palette, true);
}

@function mat-css-contrast-color-primary($hue: 500, $opacity: null) {
  @return mat-css-contrast-color($hue, $opacity, "primary");
}

@function mat-css-contrast-color-accent($hue: 500, $opacity: null) {
  @return mat-css-contrast-color($hue, $opacity, "accent");
}

@function mat-css-contrast-color-warn($hue: 500, $opacity: null) {
  @return mat-css-contrast-color($hue, $opacity, "warn");
}

// mixins
// ------
@mixin mat-css-color-and-contrast-primary($hue) {
  background: mat-css-color-primary($hue);
  color: mat-css-contrast-color($hue);
}

@mixin mat-css-color-and-contrast-accent($hue) {
  background: mat-css-color-accent($hue);
  color: mat-css-contrast-color-accent($hue);
}

@mixin mat-css-color-and-contrast-warn($hue) {
  background: mat-css-color-warn($hue);
  color: mat-css-contrast-color-warn($hue);
}

@mixin mat-css-bg($hue) {
  background: mat-css-color-primary($hue);
}

@mixin mat-css-dark-theme {
  :host-context(#{variables.$dark-theme-selector}) & {
    @content;
  }
}

@mixin mat-css-light-theme {
  :host-context(#{variables.$light-theme-selector}) & {
    @content;
  }
}

@mixin mat-css-dark-theme-global {
  @if variables.$dark-theme-selector {
    #{variables.$dark-theme-selector} & {
      @content;
    }
  }
}

@mixin mat-css-light-theme-global {
  #{variables.$light-theme-selector} & {
    @content;
  }
}

// Short hand for both light and dark selectors
@mixin mat-css-light-dark-theme-global {
  #{variables.$light-theme-selector} & {
    @content;
  }
  @if variables.$dark-theme-selector {
    #{variables.$dark-theme-selector} & {
      @content;
    }
  }
}

@mixin mat-css-set-palette-defaults($css-var-map, $paletteType: "primary") {
  $new-map: ();
  @each $var, $defaultVal in $css-var-map {
    @if ($var != "contrast") {
      $colorVal: public-color-util.hex-to-rgb($defaultVal);
      @if $colorVal != null {
        $new-map: map.merge(
          $new-map,
          (--palette-#{$paletteType}-#{$var}: #{$colorVal})
        );
      }
    }
  }
}
