@use "sass:map" as map;
@use 'sass:math' as math;
@use "../variables/" as vars;
@use "../values" as vals;

// ------------------------------------------------------------------
// (Private) Divides one number by another, to a specified precision.
// ------------------------------------------------------------------

@function -divide($dividend, $divisor, $precision: 10, $depth: 0) {
    @if $dividend < 0 and $divisor < 0 {
        $dividend: -1 * $dividend;
        $divisor: -1 * $divisor;
    }

    @if $dividend < 0 {
        @return -1 * -divide(-1 * $dividend, $divisor, $precision, $depth);
    }

    @if $divisor < 0 {
        @return -1 * -divide($dividend, $divisor * -1, $precision, $depth);
    }

    @if $divisor == 0 {
        @error 'Illegal division by zero';
    }

    $result: if(math.unit($dividend) == math.unit($divisor), 0, $dividend * 0);

    @while $dividend - $divisor >= 0 {
        $result: $result + 1;
        $dividend: $dividend - $divisor;
    }

    @if $dividend > 0 {
        @if $depth < $precision {
            $result: $result + -divide($dividend * 10, $divisor, $precision, $depth + 1) * 0.1;
        }

        @else if $depth == $precision {
            $next-digit: -divide($dividend * 10, $divisor, $precision, $depth + 1);

            @if $next-digit >= 5 {
                $result: $result + 1;
            }
        }
    }

    @return $result;
}


// ------------------------------------------------------------------
// (Private) Converts a value in px to a value in rem
// ------------------------------------------------------------------

@function -px-to-rem($pixels) {

    $px-to-rem: -divide($pixels, vars.$root-font-size-equiv) * 1rem;
    $px-to-rem: -divide(math.round($px-to-rem * 100), 100);

    @return $px-to-rem;
}


// ------------------------------------------------------------------
// Get a valid FDS unit
// ------------------------------------------------------------------

@function units($value, $unit: 'px') {

    @if map.has-key(vals.$spacers, $value) {

        $result-in-pixels: map.get(vals.$spacers, $value);

        @if $unit == 'rem' {
            @return -px-to-rem($result-in-pixels);
        }

        @return $result-in-pixels;
    }

    @error '#{$value} is not a valid FDS unit token.';

}