// RIVER Design-System: Utilities - Normalise //

// Normalise our defined utilities to they're ready for output,
// and define common utility groups in order to speed up utility output.

// Define common utility groups
$design-utilities-normalised: ();
$design-utilities-enabled: ();
$design-utilities-responsive: ();
$design-utilities-responsive-at: ();
$design-utilities-responsive-down: ();
$design-utilities-states: ();
$design-utilities-media: ();

// Loop through and format utility definitions
@if(design-setting('utilities')) {

    @each $utilityName, $utilitySettings in design-utilities() {

        // Only include utilities that have been defined as a map
        @if(type-of($utilitySettings) == 'map') {

            // Validate
            @if(not(map-has-key($utilitySettings, 'properties') and map-has-key($utilitySettings, 'values'))) {
                @error("design-utilities: missing properties and/or values for '#{$utilityName}'");
            }

            // Update the utility settings to apply all defaults
            // Defaults are taken from $design-settings for 'utilities'
            $utilitySettings: design-utilities-normalise($utilityName, $utilitySettings);

            // Validate the utility properties and values
            $utilityValid: true;
            $utilityProperties: map-get($utilitySettings, 'properties');
            @if( not( (type-of($utilityProperties) == 'map') or (type-of($utilityProperties) == 'string') ) ) {
                $utilityValid: false;
                @warn("utilities/normalise: incorrect utility properties defined for '#{$utilityName}'", $utilityProperties);
            }
            $utilityValues: map-get($utilitySettings, 'values');
            @if( not( (type-of($utilityValues) == 'map') or (length($utilityValues) >= 1 and str-char-first(nth($utilityValues, 1)) == '@') ) ) {
                $utilityValid: false;
                @warn("utilities/normalise: incorrect utility values defined for '#{$utilityName}'", $utilityValues);
            }

            // Note (by name) what groups this utility is in to speed up utility output
            @if($utilityValid and map-get($utilitySettings, 'enabled')) {
                $design-utilities-enabled: append($design-utilities-enabled, $utilityName);
                @if(map-get($utilitySettings, 'responsive')) {
                    $design-utilities-responsive: append($design-utilities-responsive, $utilityName);
                }
                @if(map-get($utilitySettings, 'responsiveAt')) {
                    $design-utilities-responsive-at: append($design-utilities-responsive-at, $utilityName);
                }
                @if(map-get($utilitySettings, 'responsiveDown')) {
                    $design-utilities-responsive-down: append($design-utilities-responsive-down, $utilityName);
                }
                @if(map-get($utilitySettings, 'states')) {
                    $design-utilities-states: append($design-utilities-states, $utilityName);
                }
                @if(map-get($utilitySettings, 'media')) {
                    $design-utilities-media: append($design-utilities-media, $utilityName);
                }
            }

            // Update the normalised utilities
            $design-utilities-normalised: map-set($design-utilities-normalised, $utilityName, $utilitySettings);

        } @else {
            @warn("utilities/normalise: invalud utility settings for '#{$utilityName}', utility not normalised", $utilitySettings);
        }
    }

    @if(length($design-utilities) == 0) {
        @warn("utilities/normalise: utilities are enabled, though none are defined within $design-utilities");
    }

}
