@use 'sass:map';
@use 'configure-palette';
@use 'color-palettes' as palette;
@use 'get-color';

$daff-light-theme: (
	'mode': 'light',
	'font-color': palette.$black,
	'base': palette.$white,
	'base-contrast': palette.$black,
	'white': palette.$white,
	'black': palette.$black,
	'neutral': configure-palette.daff-configure-palette(palette.$daff-neutral, 60),
);

$daff-dark-theme: (
	'mode': 'dark',
	'font-color': palette.$white,
	'base': palette.$black,
	'base-contrast': palette.$white,
	'white': palette.$white,
	'black': palette.$black,
	'neutral': configure-palette.daff-configure-palette(palette.$daff-neutral, 50),
);

$supported-theme-modes: (
	'light': $daff-light-theme,
	'dark': $daff-dark-theme
);

/// @deprecated Use `daff-create-theme` instead.
/// Create a theme object given some initial settings.
///
/// Sets light and dark mode defaults for `$info`, `$warn`, `$critical`, and `$success`
/// that can be overriden by using the `daff-configure-theme-status` function.
///
/// @group Theming
///
/// @example scss
/// 	$primary: configure-palette.daff-configure-palette(palette.$daff-blue, 60);
/// 	$secondary: configure-palette.daff-configure-palette(palette.$daff-purple, 60);
/// 	$tertiary: configure-palette.daff-configure-palette(palette.$daff-turquoise, 60);
/// 	$theme: daff-configure-theme($primary, $secondary, $tertiary, 'light');
///
@function daff-configure-theme(
	$primary,
	$secondary,
	$tertiary,
	$mode: 'light'
) {
	$info: null;
	$warn: null;
	$critical: null;
	$success: null;

	@if($mode == 'dark') {
		$info: configure-palette.daff-configure-palette(palette.$daff-neutral, 50);
		$warn: configure-palette.daff-configure-palette(palette.$daff-bronze, 50);
		$critical: configure-palette.daff-configure-palette(palette.$daff-red, 50);
		$success: configure-palette.daff-configure-palette(palette.$daff-green, 50);
	}
	@if($mode == 'light') {
		$info: configure-palette.daff-configure-palette(palette.$daff-neutral, 60);
		$warn: configure-palette.daff-configure-palette(palette.$daff-bronze, 60);
		$critical: configure-palette.daff-configure-palette(palette.$daff-red, 60);
		$success: configure-palette.daff-configure-palette(palette.$daff-green, 60);
	}

	@return (
		'primary': $primary,
		'secondary': $secondary,
		'tertiary': $tertiary,
		'informational': $info,
		'warn':  $warn,
		'critical': $critical,
		'success': $success,
		'core': daff-build-theme-core($mode)
	);
}

/// Create a status theme object given some initial settings.
///
/// @group Theming
///
/// @example scss
/// 	$info: configure-palette.daff-configure-palette(palette.$daff-blue, 60);
/// 	$warn: configure-palette.daff-configure-palette(palette.$daff-bronze, 60);
/// 	$critical: configure-palette.daff-configure-palette(palette.$daff-red, 60);
/// 	$success: configure-palette.daff-configure-palette(palette.$daff-green, 60);
/// 	$theme: daff-configure-theme-status($info, $warn, $critical, $success);
///
@function daff-configure-theme-status(
	$theme,
	$warn,
	$critical,
	$success,
	$info,
) {
	@debug $theme;
	@return map.merge($theme, (
		'warn':  $warn,
		'critical': $critical,
		'success': $success,
		'informational': $info,
	));
}

/// @access private
///
/// Retrieves the core theme given a theme mode
/// $mode: "light" | "dark"
///
@function daff-build-theme-core($mode: 'light') {
	$error-msg: 'is not a valid theme mode - valid modes:';
	@if (not map.has-key($supported-theme-modes, $mode)) {
		@error '`#{$mode}` `#{$error-msg}` `#{map-keys($supported-theme-modes)}`';
	}

	@return map.get($supported-theme-modes, $mode);
}
