@use 'sass:list';
@use 'sass:meta';
@use 'sass:string';
@use '../../functions/list/list-includes/list-includes.scss' as *;
@use '../../functions/math/get-numeric/get-numeric.scss' as *;
@use '../../functions/math/with-unit/with-unit.scss' as *;
@use '../../functions/string/str-split/str-split.scss' as *;
@use '../../functions/string/str-trim/str-trim.scss' as *;
@use '../../functions/string/str-replace/str-replace.scss' as *;
@use '../../variables' as vars;

@function _quote-if-needed($font-family) {
	$font-family: str-trim($font-family);

	@if (string.index($font-family, ' ') != null) {
		$font-family: str-replace($font-family, "'", '');
		$font-family: str-replace($font-family, '"', '');
		// `string.quote` does not work for some reason :(
		$font-family: '"' + $font-family + '"';
	}

	@return $font-family;
}

/**
 * Shorthand for writing `font-*` rules in syntax like vanilla CSS `font` property,
 * but without specifying the required font-family property.
 *
 * @param    {string|list|number}    $params                A set of rules for one or more of the following properties: `font-style`, `font-weight`, `font-size`, `line-height`.
 * @param    {?string}               $font-family [null]    The `font-family` property value.
 */
@mixin font($params, $font-family: null) {
	$font-style: null;
	$font-weight: null;
	$font-size: null;
	$line-height: null;

	$params: str-split(#{$params}, ' ');

	@each $param in $params {
		// font-style
		@if (list-includes(vars.$font-styles, $param)) {
			$font-style: string.unquote($param);
		}
		// font-weight
		@else if (list-includes(vars.$font-weights, $param)) {
			$font-weight: string.unquote($param);
		}
		// line-height and (maybe) font-size
		@else if (string.index($param, '/')) {
			$parsed: str-split($param, '/');

			@if (list.length($parsed) == 1) {
				$font-size: if(string.index($param, '/') == 1, null, string.unquote(list.nth($parsed, 1)));
				$line-height: if(string.index($param, '/') == 1, string.unquote(list.nth($parsed, 1)), null);
			} @else if (list.length($parsed) > 1) {
				$font-size: string.unquote(list.nth($parsed, 1));
				$line-height: string.unquote(list.nth($parsed, 2));
			}
		}
		// font-family or font-size
		@else {
			$numeric: get-numeric($param);

			@if ($numeric) {
				$font-size: with-unit($numeric);
			} @else {
				$font-family: if(not $font-family, $param, $font-family + ' ' + $param);
			}
		}
	}

	$font-family: if($font-family, meta.inspect($font-family), null);

	@if ($font-family) {
		$font-families: ();

		@each $font-family in str-split($font-family, ',') {
			$font-families: list.append(
				$font-families,
				// Prevent double quotes
				string.unquote(_quote-if-needed($font-family)),
				comma,
			);
		}

		$font-family: $font-families;
	}

	font-family: $font-family;
	font-size: $font-size;
	line-height: $line-height;
	font-style: $font-style;
	font-weight: $font-weight;
}
