@use "sass:string";
@use "sass:math";
@use "sass:map";
@use "sass:list";
@use "sass:meta";
@use "../config/feature-flags" as config-flags;
@use "../config/constants" as config-constants;
@use "../functions/strings" as fn-string;
@use "../functions/math" as fn-math;

@function strip-unit($value) {
    @if meta.type-of($value) != "number" {
        @error "strip-unit() requires a number";
    }
    @return math.div($value, ($value * 0 + 1));
}

// used in animation unique name creation
@function safe-unit-name($unit) {
    @if $unit == "%" {
        @return "per";
    } @else if $unit == "." {
        @return "dot";
    } @else {
        @return $unit;
    }
}

// Ensures a value has a unit, adding $default-unit if none exists
// @param {Number|String} $val - The value to check
// @return {String} - The value with units
@function fix-units($val, $unit: config-flags.$default-unit, $debug: null) {
    // Numbers first (hot path for utility generation)
    @if meta.type-of($val) == "number" {
        @if math.is-unitless($val) {
            @return $val + $unit;
        }
        @return $val;
    }

    // Handle null values
    @if not $val {
        @return null;
    }

    // Type validation
    @if meta.type-of($val) != "string" {
        @error "fix-units() requires a number or string value";
        @return null;
    }

    // String handling - strip quotes first
    $val: fn-string.strip-quotes($val);

    // CSS keywords - return as is
    @if $val == auto or $val == inherit or $val == initial or $val == "min-content" or $val == "max-content" or $val == "fit-content" {
        @return #{$val};
    }

    // Check if string already has units
    @each $u in config-constants.$units {
        @if string.slice($val, -1 * string.length($u)) == $u {
            $number-part: string.slice($val, 1, string.length($val) - string.length($u));

            $parsed: fn-math.to-number($number-part, string.unquote($u));
            @if $parsed {
                @return $parsed;
            }

            @return $val;
        }
    }

    // Try to convert to number if possible (unitless case - skip unit detection)
    $parsed: fn-math.to-number-raw($val);
    @if $parsed {
        @return list.nth($parsed, 1) + $unit;
    }

    // Default: just add the unit
    @return string.unquote($val + $unit);
}
