@use "sass:color";
@use "sass:math";
@use "helper";

@function -normalize($v) {
    $v: math.div($v, 255);
    @return if($v < 0.03928, math.div($v, 12.92), math.pow(math.div($v + 0.055, 1.055), 2.4));
}

@function luminance($color) {
    $color: helper.color-of($color, "luminance", "color");
    $red: -normalize(color.red($color));
    $green: -normalize(color.green($color));
    $blue: -normalize(color.blue($color));

    @return 0.2126 * $red + 0.7152 * $green + 0.0722 * $blue;
}

@function darkest($color1, $color2) {
    $color1: helper.color-of($color1, "darkest-of", "color1");
    $color2: helper.color-of($color2, "darkest-of", "color2");
    @return if(luminance($color1) < luminance($color2), $color1, $color2);
}

@function lightest($color1, $color2) {
    $color1: helper.color-of($color1, "lightest-of", "color1");
    $color2: helper.color-of($color2, "lightest-of", "color2");
    @return if(luminance($color1) > luminance($color2), $color1, $color2);
}

@function contrast-ratio($back, $color) {
    $back: helper.color-of($back, "contrast-ratio", "back");
    $color: helper.color-of($color, "contrast-ratio", "color");
    $backLum: luminance($back) + 0.05;
    $colorLum: luminance($color) + 0.05;
    @return math.div(math.max($backLum, $colorLum), math.min($backLum, $colorLum));
}

@function tone($color) {
    $color: helper.color-of($color, "tone", "color");
    $minCnt: 3.1;
    $lightCnt: contrast-ratio($color, white);
    $darkCnt: contrast-ratio($color, rgba(black, 0.87));
    @if ($lightCnt < $minCnt) and ($darkCnt > $lightCnt) {
        @return "light";
    } @else {
        @return "dark";
    }
}

@function contrast($base, $color1, $color2) {
    $base: helper.color-of($base, "contrast", "base");
    $color1: helper.color-of($color1, "contrast", "color1");
    $color2: helper.color-of($color2, "contrast", "color2");
    $col1Cnt: contrast-ratio(darkest-of($base, $color1), lightest-of($base, $color1));
    $col2Cnt: contrast-ratio(darkest-of($base, $color2), lightest-of($base, $color2));
    @if $col1Cnt > $col2Cnt {
        @return $color1;
    } @else {
        @return $color2;
    }
}

@function harmony($base, $color1, $color2) {
    $base: helper.color-of($base, "harmony", "base");
    $color1: helper.color-of($color1, "harmony", "color1");
    $color2: helper.color-of($color2, "harmony", "color2");
    $col1Cnt: contrast-ratio(darkest-of($base, $color1), lightest-of($base, $color1));
    $col2Cnt: contrast-ratio(darkest-of($base, $color2), lightest-of($base, $color2));
    @if $col1Cnt < $col2Cnt {
        @return $color1;
    } @else {
        @return $color2;
    }
}
