@import '../variables';
@import 'color-contrast';

@function get-colors() {
    $result: $colors;

    @if not map-has-key($map: $colors, $key: 'light') {
        $light: lighten(mix(map-get($colors, 'primary'), grayscale(map-get($colors, 'primary')), $light-saturation), $light-lightness);
        $result: map-merge($result, ('light': $light));
    }

    @if not map-has-key($map: $colors, $key: 'dark') {
        $dark: darken(mix(map-get($colors, 'primary'), grayscale(map-get($colors, 'primary')), $dark-saturation), $dark-darkness);
        $result: map-merge($result, ('dark': $dark));
    }

    @return $result;
}

@function build-pallet() {
    $result: ();

    $base-palette: get-colors();

    @each $key,
    $value in $base-palette {
        $group: ($key: ('base': $value,
                    'light': lighten($value, $color-variation),
                    'lighter': lighten($value, $color-variation * 2),
                    'dark': darken($value, $color-variation),
                    'darker': darken($value, $color-variation * 2)));

        $result: map-merge($result, $group);
    }

    @return $result;
}

$color-pallette: build-pallet();

/*
    GET COLOR

    usage:
    // for the base color
    color(primary);

    // for variations of a color
    color(primary, lighter);
    color(primary, light);
    color(primary, dark);
    color(primary, darker);
*/
@function color($name: 'primary', $variant: 'base', $opacity: 1) {
    $color: null;

    $name: $name + unquote("");

    @if(type-of($variant)=='number') {
        $opacity: $variant;
        $variant: 'base';
    }

    // Get the color name
    $color-name: map-get($color-pallette, $name);

    // Get the color variant
    @if $color-name or $name=='black'or $name=='white' {
        @if $name=='black' {
            $color: black;
        }

        @else if $name=='white' {
            $color: white;
        }

        @else {
            $color: map-get($color-name, $variant);
        }

        @if $color {
            @return rgba($color, $opacity);
        }

        @else {
            @error "Invalid color variation: '#{$name}', '#{$variant}'."
        }
    }

    @else {
        @error "Invalid color name: '#{$name}'."
    }

    @return $color;
}

/*
    GET CONTRASTING COLOR FOR TEXT ACCESSIBILITY (WCAG 2.0 AA+)

    usage:
    // text for the base color
    text-color(primary);

    // for variations of a color
    text-color(primary, lighter);
    text-color(primary, light);
    text-color(primary, dark);
    text-color(primary, darker);
*/
@function text-color($name: 'primary', $variant: 'base', $opacity: 1) {
    $color: color($name, $variant, $opacity);

    @return get-contrast-color($color);
}

// Used for splitting up color blocks - ex: "primary dark 0.75"
@function split-color-list($color, $variant: base, $opacity: 1) {
    @if(length($color) > 1) {
        $g-color: nth($color, 1);
        $g-variant: nth($color, 2);
        $g-opacity: 1;

        @if(length($color) > 2) {
            $g-opacity: nth($color, 3);
        }

        @return rgba(var(--ks-color-#{$g-color}-#{$g-variant}), $g-opacity);
    }

    @else {
        @return rgba(var(--ks-color-#{$color}-#{$variant}), $opacity);
    }
}

@function getRGB($color) {
    @return red($color),
    green($color),
    blue($color);
}

@function color-value($name: 'primary', $variant: 'base', $opacity: 1, $important: false) {
    @if(type-of($variant)=='number') {
        $opacity: $variant;
        $variant: 'base';
    }

    @if($important) {
        @return rgba(var(--ks-color-#{$name}-#{$variant}), $opacity) !important;
    }

    @else {
        @return rgba(var(--ks-color-#{$name}-#{$variant}), $opacity);
    }
}

@function text-color-value($name: 'primary', $variant: 'base', $opacity: 1, $important: false) {
    @if(type-of($variant)=='number') {
        $opacity: $variant;
        $variant: 'base';
    }

    @if($important) {
        @return rgba(var(--ks-color-#{$name}-#{$variant}-text), $opacity) !important;
    }

    @else {
        @return rgba(var(--ks-color-#{$name}-#{$variant}-text), $opacity);
    }
}
