@use 'sass:list';
@use 'sass:map';
@use 'sass:string';

/// 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;
}

/// Capitalize string
///
/// @param {String} $string
/// @return {String}
///
@function capitalize($string) {
  /* stylelint-disable-next-line scss/operator-no-newline-after */
  @return string.to-upper-case(string.slice($string, 1, 1)) + string.slice($string, 2);
}

// Alias
@function str-ucfirst($string) {
  @return capitalize($string);
}

/// Uncapitalize string
///
/// @param {String} $string
/// @return {String}
///
@function uncapitalize($string) {
  /* stylelint-disable-next-line scss/operator-no-newline-after */
  @return string.to-lower-case(string.slice($string, 1, 1)) + string.slice($string, 2);
}

// Alias
@function str-lcfirst($string) {
  @return uncapitalize($string);
}

/// Capitalize each word in string
///
/// @param {String} $string
/// @return {String}
///
@function str-ucwords($string) {
  $progress: $string;
  $result: '';
  $running: true;

  @while $running {
    $index: string.index($progress, ' ');
    @if $index {
      $result: $result + capitalize(string.slice($progress, 1, $index));
      $progress: string.slice($progress, ($index + 1));
    } @else {
      $running: false;
    }
  }

  @return capitalize($result) + capitalize($progress);
}

/// Return whether `$value` is contained in `$list`
///
/// @param {List} $list
/// @param {Value} $value
/// @return {boolean}
///
@function contain($list, $value) {
  @return not not list.index($list, $value);
}

/// Camelize string
///
/// @param {String} $string
/// @return {String}
///
@function camelize($string) {
  $progress: $string;
  $result: '';
  $exclude: ' ', '-', '–', '—', '_', ',', ';', ':', '.';

  @while string.length($progress) > 0 {
    $char: string.slice($progress, 1, 1);

    @if contain($exclude, $char) {
      /* stylelint-disable-next-line scss/operator-no-newline-after */
      $progress: capitalize(string.slice($progress, 2, 2)) + string.slice($progress, 3);
    } @else {
      $result: $result + $char;
      $progress: string.slice($progress, 2);
    }
  }

  @return $result;
}

/// SCSS function that returns a string in pascal case
///
/// @param {String} $string
/// @return {String}
///
@function pascalize($string) {
  @return capitalize(camelize($string));
}
