// RIVER Design-System: System - Functions / Settings //

// Functions to interact with our design system settings, defined in 'system/settings'.

// Get a particular design setting
@function design-setting($key, $default: null) {
    // Grab the relevant settings
    $settings: design-settings();

    // Look for a setting value
    $value: map-deep-get($settings, $key);
    @if(not($value == null)) {
        @return $value;
    }

    // Return a default if provided
    @if(not($default == null)) {
        @return $default;
    }

    // Look for a default
    // eg, 'colors.utilities.include-range' -> 'default.utilities.include-range'
    $group: str-before($key, '.');
    $keyDefault: str-replace($key, $group, '_default');
    $value: map-deep-get($settings, $keyDefault);
    @if(not($value == null)) {
        @return $value;
    }

    // Setting not found
    @error("design-setting() unable to find the key '#{$key}' within the design settings");
}

// Get the design settings map (or a particular group of settings)
@function design-settings($group: null) {
    $settings: $design-settings;

    @if($group) {
        @if(map-has-key($settings, $group)) {
            $settings: map-get($settings, $group);
        } @else {
            @error("design-settings() unable to match the group '#{$group}'");
        }
    }

    @return $settings;
}

// Apply new settings to the existing settings map
// This returns the updated list of settings, and needs to be called as:
// $design-settings: design-settings-apply((...))
// eg, $design-settings: design-settings-apply(( 'variables': ..., 'preload': ... ));
// This merges in your defined settings, so you only need to define what you want to update.
@function design-settings-apply($settingsMap: ()) {
    // Note the current settings
    $settings: design-settings();

    // Validate
    @if(length($settingsMap) == 0) {
        @warn("design-settings-apply() an empty list was provided");
        @return $settings;
    }
    @if(not(type-of($settingsMap) == 'map')) {
        @error("design-settings-apply() invalid setttings map");
    }

    // Loop through each group to update
    @each $group, $value in $settingsMap {
        // Validate group key
        @if(not(map-has-key($settings, $group))) {
            @error("design-settings-apply() invalid setttings group '#{$group}'");
        }

        // Apply the new settings
        $settingsGroup: map-get($settings, $group);
        @if(type-of($value) == 'map' or type-of($value) == 'list') {
            $settingsGroup: map-merge($settingsGroup, $value);
        } @else {
            $settingsGroup: $value;
        }

        // Update the settings
        $settings: map-set($settings, $group, $settingsGroup);
    }

    @return $settings;
}
