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

// Output all of our (normalised) singular utilities here.
// These can refer to CSS properties directly, or design system maps.
// Utility classes have the format: {utility|property}--{value} (see 'system/mixins-utilities' for more information).

// Ensure enabled utilities are defined
$design-utilities-enabled: () !default; // Should have been defined as part of 'utilities/normalise'

// Output utilities
@if(design-setting('utilities')) {
    /* RIVER Design-System: Utilities */

    // Enabled + Responsive utilities
    // Loop each breakpoint; uses an empty variation for the first breakpoint
    // eg, .md:none { display: none; }
    @if(length($design-utilities-enabled) > 0) {
        @each $breakpoint, $width in design-breakpoints() {

            // Enabled + Breakpoints Up
            @include design-breakpoint-up($breakpoint) {
                // Define the variation label; an empty string for the first breakpoint (0 upwards)
                $variationPrefix: if($width > 0, $breakpoint, ''); // eg, '', 'md', etc

                // Utilities to loop through; loop relevant utilities only to reduce compile time
                $utilitiesLoop: if($width > 0, $design-utilities-responsive, $design-utilities-enabled);

                @each $utilityName in $utilitiesLoop {
                    // Define the utility
                    $utilitySettings: map-get($design-utilities-normalised, $utilityName);
                    $utilityResponsive: map-get($utilitySettings, 'responsive');

                    // Only include the utility if required
                    @if( ($width == 0) or ($utilityResponsive == true) or (index($utilityResponsive, $breakpoint)) ) {
                        /* #{$utilityName}#{if($variationPrefix!='',' @ '+$variationPrefix,'')} */
                        @include design-output-utility($utilitySettings, $variationPrefix);
                    }
                }
            }

            // Breakpoints At
            @include design-breakpoint-at($breakpoint) {
                // Define the variation label; an empty string for the first breakpoint (0 upwards)
                $variationPrefix: $breakpoint + '-at'; // eg, 'xs-at', 'md-at', etc

                // Utilities to loop through; loop relevant utilities only to reduce compile time
                $utilitiesLoop: $design-utilities-responsive-at;

                @each $utilityName in $utilitiesLoop {
                    // Define the utility
                    $utilitySettings: map-get($design-utilities-normalised, $utilityName);
                    $utilityResponsive: map-get($utilitySettings, 'responsiveAt');

                    // Only include the utility if required
                    @if( ($width == 0) or ($utilityResponsive == true) or (index($utilityResponsive, $breakpoint)) ) {
                        /* #{$utilityName} @ #{$variationPrefix}-at */
                        @include design-output-utility($utilitySettings, $variationPrefix);
                    }
                }
            }

            // Breakpoints Down
            @include design-breakpoint-down($breakpoint) {
                // Define the variation label; an empty string for the first breakpoint (0 upwards)
                $variationPrefix: $breakpoint + '-down'; // eg, 'xs-at:', 'md-at:', etc

                // Utilities to loop through; loop relevant utilities only to reduce compile time
                $utilitiesLoop: if($width > 0, $design-utilities-responsive-down, ());

                @each $utilityName in $utilitiesLoop {
                    // Define the utility
                    $utilitySettings: map-get($design-utilities-normalised, $utilityName);
                    $utilityResponsive: map-get($utilitySettings, 'responsiveAt');

                    // Only include the utility if required
                    @if( ($width == 0) or ($utilityResponsive == true) or (index($utilityResponsive, $breakpoint)) ) {
                        /* #{$variationPrefix}:#{$utilityName} - responsive down */
                        @include design-output-utility($utilitySettings, $variationPrefix);
                    }
                }
            }

        }// design-breakpoints()

        // States (interactive)
        @if(length($design-utilities-states) > 0) {
            // Utilities to loop through; loop relevant utilities only to reduce compile time
            $utilitiesLoop: $design-utilities-states;

            @each $utilityName in $utilitiesLoop {
                /* #{$utilityName} - states */

                // Define and include the utility
                $utilitySettings: map-get($design-utilities-normalised, $utilityName);
                $utilityStates: map-get($utilitySettings, 'states');
                $utilityStates: if($utilityStates == true, 'states', $utilityStates);

                // Loop relevant interactions; 'states', 'hover', 'focus', etc
                @each $utilityType in $utilityStates {
                    @include design-output-utility($utilitySettings, '', $utilityType);
                }
            }
        }

        // Media Types
        @if(length($design-utilities-media) > 0) {
            // Utilities to loop through; loop relevant utilities only to reduce compile time
            $utilitiesLoop: $design-utilities-media;

            @each $utilityName in $utilitiesLoop {
                /* #{$utilityName} - media */

                // Define and include the utility
                $utilitySettings: map-get($design-utilities-normalised, $utilityName);
                $utilityMedia: map-get($utilitySettings, 'media');
                $utilityMedia: if($utilityMedia == true, ('all' 'print' 'screen' 'speech'), $utilityMedia);

                // Target relevant media types
                @each $mediaType in $utilityMedia {
                    // Define the variation label
                    $variationPrefix: $mediaType;// + design-setting('lang.utilities.variation-seperator'); // eg, 'print:', etc

                    // Include the relevant media query
                    @media #{$mediaType} {
                        @include design-output-utility($utilitySettings, $variationPrefix, 'media');
                    }
                }
            }
        }

    } // design-settings-utilities-enabled

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

}
