/// Has lower case function
// --------------------------
/// Check if a string has any lowercase character
///
/// @access public
/// @group case utilities
/// @param {string} $string
/// @return {boolean}
///

$lowercase-letters: null;

@function has-lower-case($str) {
  $hasLowerCaseLetter: false;
  $letterList: to-letter-list($str);

  @each $char in $letterList {
    @if is-lowercase($char) {
      $hasLowerCaseLetter: true !global;
    }
  }
  @return $hasLowerCaseLetter;
}

@function is-lower-case($char) {
  $isLowerCaseLetter: false;
  @if $lowercase-letters == null {
    $lowercase-letters: list-to-str(character-set("a-z"), "") !global;
  }
  @if str-contains($lowercase-letters, $char) {
    $isLowerCaseLetter: true;
  }
  @return $isLowerCaseLetter;
}

@function is-letter($char) {
  $isLetter: false;
  @if $lowercase-letters == null {
    $lowercase-letters: list-to-str(character-set("a-z"), "") !global;
  }

  @if str-contains($lowercase-letters, to-lower-case($char)) {
    $isLetter: true;
  }

  @return $isLetter;
}

/// Kebab Case function
// --------------------------
/// Convert any string into a kebabcase string.
///
/// @access public
/// @group case utilities
/// @param {string} $string
/// @return {string}
///

@function kebabCase($str) {
  $new-str: allowed-characters(
    to-lower-case(safe-characters($str)),
    ("a-Z", "0-9", " ")
  );

  @return str-replace($new-str, " ", "-");
}

/// Sentence case function
// --------------------------
/// Convert any string into a sentence case.
///
/// @access public
/// @group case utilities
/// @param {string} $string
/// @return {string}
///
@function sentenceCase($str) {
  $new-str: "";
  @if $str != null {
    $letterList: to-letter-list($str);

    @each $char in $letterList {
      @if is-lower-case($char) or is-number($char) {
        $new-str: "#{$new-str}#{$char}";
      } @else {
        $new-str: "#{$new-str} #{trim($char)}";
      }
    }
  } @else {
    @return $str;
  }
  @return trim($new-str);
}

@function cleanupBem($str) {
  @return str-replace(str-replace($str, "--", "-"), "__", "_");
}

/// camelCaseToKebabCase function
// --------------------------
/// Convert a camelCase string to a kebab-case string
///
/// @access public
/// @group case utilities
/// @param {string} $string
/// @return {string}
///
@function camelCaseToKebabCase($str) {
  $str: cleanupBem($str);
  $str: sentenceCase($str);
  $str: kebabCase($str);

  @return $str;
}

/// camelCaseToKebabCase function
// --------------------------
/// Convert a camelCase string to a kebab-case string
///
/// @access public
/// @group case utilities
/// @param {string} $string
/// @return {string}
///
@function isCamelCase($str) {
  @if has-lowercase($str) and
    has-uppercase($str) and
    is-lowercase(first-character($str)) and
    has-unallowed-characters($str, character-set("a-Z"))
  {
    @return true;
  }
  @return false;
}
