@use 'sass:meta';
@use 'sass:math';
@use './type-checking' as check;

/// Strip the unit from a number.
///
/// @param {Number} $number
/// @return {Number}
/// @group Number
/// @since v1.3.0
///
/// @example
///    @debug strip-unit(3rem);
///    //=> 3
///
@function strip-unit($number) {
	@if not check.is-number($number) {
		@error '❌  ===> #{$number} is not a number';
	}

	@return math.div($number, ($number * 0 + 1));
}

/// Invert a number.
///
/// @param {Number} $number
/// @return {Number}
/// @group Number
/// @author Felix Scholze
/// @since v1.3.0
///
/// @example
///    @debug number-invert(7);
///    //=> -7
///
@function number-invert($number) {
	@if not check.is-number($number) {
		@error '❌  ===> #{$number} is not a number';
	}

	@return $number * -1;
}

/// Generate a random number between min and max.
///
/// @param {Number} $min
/// @param {Number} $max
/// @return {Number}
/// @group Number
/// @author Felix Scholze
/// @since v1.6.0
///
/// @example
///    @debug random-num(3, 45);
///    //=> random number between 3 and 45
///
@function random-num($min, $max) {
	@if not check.is-number($min) {
		@error '❌  ===> $min: #{$min} is not a number';
	}
	@if not check.is-number($max) {
		@error '❌  ===> $max: #{$max} is not a number';
	}

	$random-num: $min + math.floor(math.random() * (($max - $min) + 1));

	@return $random-num;
}

/// Round a number to a specific number of decimal places.
///
/// @param {Number} $number
/// @param {Number} $decimals [0]
/// @group Number
/// @author Brecht De Ruyte
/// @since v2.3.0
///
/// @example
///    .test-round {
///      padding: fn.round(1.23456789, 2) + px;
///    }
///
///    //=>
///    .test-round {
///      padding: 1.23px;
///    }
@function round($number, $decimals: 0) {
	$n: 1;

	@if $decimals > 0 {
		@for $i from 1 through $decimals {
			$n: $n * 10;
		}
	}

	@return math.div(math.round($number * $n), $n);
}