////
///
/// String Functions
/// ===========================================================================
///
/// Utility functions for string manipulation.
///
/// @group Functions
/// @author Scape Agency
/// @link https://scape.style
/// @since 0.1.0 initial release
/// @access public
///
////

// ============================================================================
// Use
// ============================================================================

@use "sass:string";
@use "sass:list";
@use "sass:meta";

// ============================================================================
// Functions
// ============================================================================

/// Replace substring in a string
/// @param {String} $string - Original string
/// @param {String} $search - Substring to find
/// @param {String} $replace [''] - Replacement string
/// @return {String} - Modified 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;
}

/// Convert string to lowercase with hyphens (kebab-case)
/// @param {String} $string - Original string
/// @return {String} - Kebab-case string
@function to-kebab-case($string) {
    $result: "";
    $chars: "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    @for $i from 1 through string.length($string) {
        $char: string.slice($string, $i, $i);
        $index: string.index($chars, $char);

        @if $index {
            @if $i > 1 {
                $result: $result + "-";
            }
            $result: $result + string.to-lower-case($char);
        } @else if $char == " " or $char == "_" {
            $result: $result + "-";
        } @else {
            $result: $result + $char;
        }
    }

    @return $result;
}

/// Check if string starts with a given substring
/// @param {String} $string - String to check
/// @param {String} $prefix - Prefix to look for
/// @return {Boolean} - True if string starts with prefix
@function str-starts-with($string, $prefix) {
    @return string.slice($string, 1, string.length($prefix)) == $prefix;
}

/// Check if string ends with a given substring
/// @param {String} $string - String to check
/// @param {String} $suffix - Suffix to look for
/// @return {Boolean} - True if string ends with suffix
@function str-ends-with($string, $suffix) {
    @return string.slice(
            $string,
            string.length($string) - string.length($suffix) + 1
        )
        == $suffix;
}

/// Capitalize first letter of string
/// @param {String} $string - Original string
/// @return {String} - Capitalized string
@function capitalize($string) {
    @return string.to-upper-case(string.slice($string, 1, 1)) +
        string.slice($string, 2);
}

/// Split string by delimiter
/// @param {String} $string - String to split
/// @param {String} $delimiter - Delimiter to split by
/// @return {List} - List of substrings
@function str-split($string, $delimiter) {
    $result: ();
    $index: string.index($string, $delimiter);

    @while $index {
        $item: string.slice($string, 1, $index - 1);
        $result: list.append($result, $item);
        $string: string.slice($string, $index + string.length($delimiter));
        $index: string.index($string, $delimiter);
    }

    @return list.append($result, $string);
}

/// Trim whitespace from both ends of string
/// @param {String} $string - String to trim
/// @return {String} - Trimmed string
@function str-trim($string) {
    // Remove leading whitespace
    @while string.slice($string, 1, 1) == " " {
        $string: string.slice($string, 2);
    }

    // Remove trailing whitespace
    @while string.slice($string, string.length($string)) == " " {
        $string: string.slice($string, 1, string.length($string) - 1);
    }

    @return $string;
}
