@import './variables';

/// Parse color hexadecimal to Rgb
/// @access public
/// @param {Color} $color - color to parse
/// @return {Color} Generated Color
@function parseRgb($color) {
    @return #{red($color), green($color), blue($color)};
}

/// Slightly lighten a color
/// @access public
/// @param {Color} $color - color to tint
/// @param {Number} $percentage - percentage of `$color` in returned color
/// @return {Color} Generated Color
@function tint($color, $percentage: 15%) {
    @return mix(white, $color, $percentage);
}

/// Slightly darken a color
/// @access public
/// @param {Color} $color - color to shade
/// @param {Number} $percentage - percentage of `$color` in returned color
/// @return {Color} Generated Color
@function shade($color, $percentage: 15%) {
    @return mix(black, $color, $percentage);
}

/// Slightly lighten a color
/// @access public
/// @param {Color} $color - color to light
/// @param {Number} $percentage - percentage of `$color` in returned color
/// @return {Color} Generated Color
@function light($color, $percentage: 30%) {
    @return lighten($color, $percentage);
}

/// Slightly darken  a color
/// @access public
/// @param {Color} $color - color to dark
/// @param {Number} $percentage - percentage of `$color` in returned color
/// @return {Color}  Generated Color
@function dark($color, $percentage: 30%) {
    @return darken($color, $percentage);
}

/// Slightly soft transparent a color
/// @access public
/// @param {Color} $color - color to transparentize
/// @param {Number} $percentage - percentage of `$color` in returned color
/// @return {Color} Generated Color
@function opacity($color, $percentage: 0.8) {
    @return transparentize($color, $percentage);
}

/// Slightly  transparent a color
/// @access public
/// @param {Color} $color - color to transparentize
/// @param {Number} $percentage - percentage of `$color` in returned color
/// @return {Color} Generated Color
@function trans($color, $percentage: 0.4) {
    @return transparentize($color, $percentage);
}

/// Slightly  more transparent a color
/// @access public
/// @param {Color} $color - color to transparentize
/// @param {Number} $percentage - percentage of `$color` in returned color
/// @return {Color} Generated Color
@function lucid($color, $percentage: 0.2) {
    @return transparentize($color, $percentage);
}

// retrieve color from $colors map ie. `color(primary, base)`
@function color($color-name, $color-variant: base, $color-schema: light) {
    @if $color-variant == 'base' {
        @return map-get(map-get(map-get($colors_scheme, $color-schema), 'colors'), $color-name);
    } @else {
        @return call(
            get-function($color-variant),
            map-get(map-get(map-get($colors_scheme, $color-schema), 'colors'), $color-name),
            map-get($colors_config, $color-variant)
        );
    }
}

// retrieve color opposed
@function opposed($color: primary, $color-schema: light) {
    $opposed_colors: map-get(map-get($colors_scheme, $color-schema), 'opposed');

    $opposed: map-get($opposed_colors, 'default');
    @each $colorName, $opposedName in $opposed_colors {
        @if ($color == $colorName) {
            $opposed: $opposedName;
        }
    }
    @return $opposed;
}

// retrieve color opposed
@function opposedConfig($color-variant: base) {
    @if ($color-variant == 'base') {
        @return 'shade';
    } @else if ($color-variant == 'tint') {
        @return 'base';
    } @else if ($color-variant == 'shade') {
        @return 'base';
    } @else if ($color-variant == 'dark') {
        @return 'shade';
    } @else if ($color-variant == 'light') {
        @return 'tint';
    } @else if ($color-variant == 'lucid') {
        @return 'trans';
    } @else if ($color-variant == 'trans') {
        @return 'opacity';
    } @else if ($color-variant == 'opacity') {
        @return 'base';
    }
    @return 'base';
}

/// Gets contrast color variation
/// @param {Color} $color [currentcolor] - Triangle color
/// @return  {String} color-variation
@function contrast($color: primary, $variant: base) {
    @return opposed($color) + '-' + opposedConfig($variant);
}

@function stepped($index: 0, $color-name: 'primary', $color-schema: 'light') {
    @return generateSteppedColor(
        color($color-name, 'base', $color-schema),
        color(opposed($color-name, $color-schema), 'base', $color-schema),
        $index
    );
}

@function generateSteppedColor($color: '#000000', $opposed: '#ffffff', $index: 0) {
    $percentage: (($index) * 5) * 1%;

    @return mix($color, $opposed, $percentage);
}
