// Sass tools

@use 'sass:map';
@use 'sass:string';
@use '../variables';

/// Fargetoken som CSS-variabel, med verdien fra color maps som fallback.
/// Fallbacken er alltid light mode.
/// Ukjent tokennavn gjør at bygget kræsjer.
///
/// @param {String} $name - navn på semantisk token eller basefarge, uten `--pkt-color-`
/// @return {String} - `var(--pkt-color-$name, <verdi>)`
///
/// @example scss
///   color: functions.color-token('text-body-default');
///   // => var(--pkt-color-text-body-default, #2a2859)
///
@function color-token($name) {
  $value: map.get(variables.$pkt-semantic-colors, $name);

  @if $value == null {
    $value: map.get(variables.$pkt-colors, $name);
  }
  @if $value == null {
    @error 'Ukjent fargetoken: #{$name}';
  }

  @return var(--pkt-color-#{$name}, #{$value});
}

/// Map deep get
/// @author Kitty Giraudel
/// @access public
/// @param {Map} $map - Map
/// @param {Arglist} $keys - Key chain
/// @return {*} - Desired value

@function map-deep-get($map, $keys...) {
  @each $key in $keys {
    $map: map.get($map, $key);
  }
  @return $map;
}

// See https://codepen.io/kevinweber/pen/dXWoRw
//
// Requires the use of quotes around data URIs.

// Characters which are escaped by the escape-svg function
$escaped-characters: (('<', '%3c'), ('>', '%3e'), ('#', '%23'), ('(', '%28'), (')', '%29')) !default;

// Replace `$search` with `$replace` in `$string`
// Used on our SVG icon backgrounds for custom forms.
//
// @author Hugo Giraudel
// @param {String} $string - Initial string
// @param {String} $search - Substring to replace
// @param {String} $replace ('') - New value
// @return {String} - Updated string
@function str-replace($string, $search, $replace: '') {
  $index: string.index($string, $search);

  @if $index {
    @return string.slice($string, 1, $index - 1) + $replace +
      str-replace(string.slice($string, $index + string.length($search)), $search, $replace);
  }

  @return $string;
}

@function escape-svg($string) {
  @if string.index($string, 'data:image/svg+xml') {
    @each $char, $encoded in $escaped-characters {
      // Do not escape the url brackets
      @if string.index($string, 'url(') == 1 {
        $string: url('#{str-replace(string.slice($string, 6, -3), $char, $encoded)}');
      } @else {
        $string: str-replace($string, $char, $encoded);
      }
    }
  }

  @return $string;
}
