////
/// @group elevations
/// @author <a href="https://github.com/simeonoff" target="_blank">Simeon Simeonoff</a>
////

/// Level 1 - Umbra Shadows
/// @access private
/// @param {Color} $color - The color used to generate umbra shadows.
/// @returns {Map} Returns a map of 24 shadow elevations with the umbra color.
@function _l1-shadows($color) {
    @return (
        1: 0 1px 3px 0 $color,
        2: 0 1px 5px 0 $color,
        3: 0 1px 8px 0 $color,
        4: 0 2px 4px -1px $color,
        5: 0 3px 5px -1px $color,
        6: 0 3px 5px -1px $color,
        7: 0 4px 5px -2px $color,
        8: 0 5px 5px -3px $color,
        9: 0 5px 6px -3px $color,
        10: 0 6px 6px -3px $color,
        11: 0 6px 7px -4px $color,
        12: 0 7px 8px -4px $color,
        13: 0 7px 8px -4px $color,
        14: 0 7px 9px -4px $color,
        15: 0 8px 9px -5px $color,
        16: 0 8px 10px -5px $color,
        17: 0 8px 11px -5px $color,
        18: 0 9px 11px -5px $color,
        19: 0 9px 12px -6px $color,
        20: 0 10px 13px -6px $color,
        21: 0 10px 13px -6px $color,
        22: 0 10px 14px -6px $color,
        23: 0 11px 14px -7px $color,
        24: 0 11px 15px -7px $color
    );
}

/// Level 2 - Penumbra Shadows
/// @access private
/// @param {Color} $color - The color used to generate penumbra shadows.
/// @returns {Map} Returns a map of 24 shadow elevations with the penumbra color.
@function _l2-shadows($color) {
    @return (
        1: 0 1px 1px 0 $color,
        2: 0 2px 2px 0 $color,
        3: 0 3px 4px 0 $color,
        4: 0 4px 5px 0 $color,
        5: 0 5px 8px 0 $color,
        6: 0 6px 10px 0 $color,
        7: 0 7px 10px 1px $color,
        8: 0 8px 10px 1px $color,
        9: 0 9px 12px 1px $color,
        10: 0 10px 14px 1px $color,
        11: 0 11px 15px 1px $color,
        12: 0 12px 17px 2px $color,
        13: 0 13px 19px 2px $color,
        14: 0 14px 21px 2px $color,
        15: 0 15px 22px 2px $color,
        16: 0 16px 24px 2px $color,
        17: 0 17px 26px 2px $color,
        18: 0 18px 28px 2px $color,
        19: 0 19px 29px 2px $color,
        20: 0 20px 31px 3px $color,
        21: 0 21px 33px 3px $color,
        22: 0 22px 35px 3px $color,
        23: 0 23px 36px 3px $color,
        24: 0 24px 38px 3px $color
    );
}

/// Level 3 - Ambient Shadows
/// @access private
/// @param {Color} $color - The color used to generate ambient shadows.
/// @returns {Map} Returns a map of 24 shadow elevations with the ambient color.
@function _l3-shadows($color) {
    @return (
        1: 0 2px 1px -1px $color,
        2: 0 3px 1px -2px $color,
        3: 0 3px 3px -2px $color,
        4: 0 1px 10px 0 $color,
        5: 0 1px 14px 0 $color,
        6: 0 1px 18px 0 $color,
        7: 0 2px 16px 1px $color,
        8: 0 3px 14px 2px $color,
        9: 0 3px 16px 2px $color,
        10: 0 4px 18px 3px $color,
        11: 0 4px 20px 3px $color,
        12: 0 5px 22px 4px $color,
        13: 0 5px 24px 4px $color,
        14: 0 5px 26px 4px $color,
        15: 0 6px 28px 5px $color,
        16: 0 6px 30px 5px $color,
        17: 0 6px 32px 5px $color,
        18: 0 7px 34px 6px $color,
        19: 0 7px 36px 6px $color,
        20: 0 8px 38px 7px $color,
        21: 0 8px 40px 7px $color,
        22: 0 8px 42px 7px $color,
        23: 0 9px 44px 8px $color,
        24: 0 9px 46px 8px $color
    );
}

/// Returns shadow based on elevation, umbra, penumbra, and ambient shadow colors.
/// @access private
/// @param {number} $elevation - The elevation level to generate a shadow for.
/// @param {Color} $l1-color - The umbra color.
/// @param {Color} $l2-color - The penumbra color.
/// @param {Color} $l3-color - The ambient color.
/// @returns {String} - A string to be used as box-shadow value.
@function _elevation($elevation, $l1-color, $l2-color, $l3-color) {
    @return unquote(#{
        map-get(_l1-shadows($l1-color), $elevation),
        map-get(_l2-shadows($l2-color), $elevation),
        map-get(_l3-shadows($l3-color), $elevation)}
    );
}

/// Returns an igx elevation from an igx-elevations produced map.
/// @access public
/// @param {Map} $elevations - The igx-elevations map to extract the elevation from.
/// @param {number} $elevation - The elevation level from 1 to 24.
/// @returns {String} Returns a box-shadow value.
@function igx-elevation($elevations, $elevation) {
    @if type-of($elevation) != number or not unitless($elevation) {
        @error '$elevation must be a number';
    }

    @if $elevation < 0 or $elevation > 24 {
        @error '$elevation must be between 0 and 24';
    }

    @return map-get($elevations, #{$elevation});
}

/// Generates a map of 24 shadows.
/// @access public
/// @requires _elevation
/// @param {Color} $color-1 - The umbra shadow color.
/// @param {Color} $color-2 - The penumbra shadow color.
/// @param {Color} $color-3 - The ambient shadow color.
@function igx-elevations($color-1, $color-2, $color-3) {
    $result: ('0': none);

    @for $i from 1 through 24 {
        $elevation: (#{$i}: _elevation($i, $color-1, $color-2, $color-3));
        $result: map-merge($result, $elevation)
    }

    @return $result;
}
