// When color definition differs for dark and light variant,
// it gets @if ed depending on $variant

@import 'color-palette';

$dark-theme: false !default;
$light-topbar: false !default;

@function gtkalpha($color, $alpha) {
  @return unquote("alpha(#{$color}, #{$alpha})");
}

// Determine whether the color has alpha.
@function has-alpha($color) {
  @return if(alpha($color) < 1, true, false);
}

// Determine whether the color is "light" or "dark".
@function tone($color) {
  // Calculate color brightness as per https://www.w3.org/TR/AERT/#color-contrast
  $brightness: (red($color) * 299 + green($color) * 587 + blue($color) * 114) / 1000;

  @if $brightness >= 128 {
    @return "light";
  } @else {
    @return "dark";
  }
}

$on-light: #000;
$on-dark: #fff;

// Determine whether to use dark or light color on top of given color
// to meet accessibility standards for contrast.
@function on($color) {
  $contrast-color: if(tone($color) == "dark", $on-dark, $on-light);

  @if saturation($color) > 50% or alpha($color) < 1 {
    @return $contrast-color;
  } @else {
    @return rgba($contrast-color, .87);
  }
}

// Determine the strength of highlight on top of given color.
@function highlight($color) {
  @if lightness($color) >= 80% {
    @return rgba(white, .4);
  } @else if lightness($color) >= 40% {
    @return rgba(white, .2);
  } @else {
    @return rgba(white, .05);
  }
}

// Make translucent color opaque by blending with the background color.
@function opacify($color, $on) {
  @return mix(change-color($color, $alpha: 1), $on, alpha($color) * 100%);
}

$state-overlay-opacities: (
  "hover": .08,
  "hover-alt": .04,
  "focus": .08,
  "pressed": .12,
  "dragged": .08,
  "activated": .12,
  "selected": .24,
);

// Determine the overlay color depending on the given state and color.
@function overlay($state, $color, $on: transparent, $opacity-modifier: 0) {
  @if not map-has-key($state-overlay-opacities, $state) {
    @error "Invalid state: '#{$state}'. Choose one of: #{map-keys($state-overlay-opacities)}";
  }

  @if saturation($color) > 50% or saturation($on) > 50% {
    $opacity-modifier: .04;
  }

  $opacity: map-get($state-overlay-opacities, $state) + $opacity-modifier;

  @return mix(rgba($color, 1), $on, $opacity * 100%);
}

// Private variables for dark background colors
$-dark-surface-z0: #121212;
$-dark-surface-z1: mix(white, $-dark-surface-z0, 5%);
$-dark-surface-z4: mix(white, $-dark-surface-z0, 9%);
$-dark-surface-z8: mix(white, $-dark-surface-z0, 12%);
$-dark-surface-switch-thumb: mix(white, $-dark-surface-z0, 60%);

//
// Main colors
//

$surface-z0: #f9f9f9;
$surface-z1: #fff;
$surface-z8: #fff;
$surface-switch-thumb: #fff;
$on-surface: on($surface-z0);

$primary-on-light: #1967d2;
$primary-on-dark: #8ab4f8;
$primary: $primary-on-light;
$on-primary: on($primary);

$error-on-light: #d93025;
$error-on-dark: #f28b82;
$error: $error-on-light;
$on-error: on($error);

$warning-on-light: #f9ab00;
$warning-on-dark: #fdd663;
$warning: $warning-on-light;
$on-warning: on($warning);

$success-on-light: #1e8e3e;
$success-on-dark: #81c995;
$success: $success-on-light;
$on-success: on($success);

$visited-on-light: #9334e6;
$visited-on-dark: #c58af9;
$visited: $visited-on-light;
$on-visited: on($visited);

$os-background: $-dark-surface-z0;
$on-os-background: on($os-background);

$tooltip: rgba(#616161, .9);
$on-tooltip: on($tooltip);

$scrim: rgba(black, .6);
$on-scrim: on($scrim);

$scrim-alt: rgba(black, .3);
$on-scrim-alt: on($scrim-alt);

$panel: #212121;
$on-panel: on($panel);

// for Unity panel which doesn't allow translucent colors
$panel-solid: $panel;
$on-panel-solid: on($panel-solid);

$titlebar: #424242;
$titlebar-backdrop: #303030;
$on-titlebar: on($titlebar);

$titlebar-indicator: currentcolor;

@if $dark-theme {
  $surface-z0: $-dark-surface-z0;
  $surface-z1: $-dark-surface-z1;
  $surface-z8: $-dark-surface-z8;
  $surface-switch-thumb: $-dark-surface-switch-thumb;
  $on-surface: on($surface-z0);

  $primary: $primary-on-dark;
  $on-primary: on($primary);

  $error: $error-on-dark;
  $on-error: on($error);

  $warning: $warning-on-dark;
  $on-warning: on($warning);

  $success: $success-on-dark;
  $on-success: on($success);

  $visited: $visited-on-dark;
  $on-visited: on($visited);

  $titlebar: $-dark-surface-z4;
  $titlebar-backdrop: $-dark-surface-z1;
  $on-titlebar: on($titlebar);
}

@if $light-topbar {
  $panel: $scrim;
  $on-panel: on($panel);

  $panel-solid: #e0e0e0;
  $on-panel-solid: on($panel-solid);

  $titlebar: #f0f0f0;
  $titlebar-backdrop: #ebebeb;
  $on-titlebar: on($titlebar);

  $titlebar-indicator: $primary;
}

//
// Overlay state colors
//

$overlay-selected: rgba($primary, .24);

//
// For “on” colors
//

@function primary($color) {
  @return if(tone($color) == "dark", $primary-on-light, $primary-on-dark);
}

@function error($color) {
  @return if(tone($color) == "dark", $error-on-light, $error-on-dark);
}

@function hint($color) {
  @return rgba($color, if(has-alpha($color), .6, .7));
}

@function disabled($color) {
  @return rgba($color, if(has-alpha($color), .38, .5));
}

@function disabled-hint($color) {
  @return rgba($color, if(has-alpha($color), .26, .3));
}

@function stroke($color) {
  @return rgba($color, if(has-alpha($color), .26, .3));
}

@function disabled-stroke($color) {
  @return rgba($color, if(has-alpha($color), .12, .2));
}

@function divider($color) {
  @return rgba($color, if(has-alpha($color), .12, .2));
}

@function fill($color) {
  @return rgba($color, if(has-alpha($color), .08, .08));
}

@function entry-fill($color) {
  @return rgba($color, if(has-alpha($color), .04, .04));
}

@function scrollbar-thumb($color, $state: null) {
  @if $state == null {
    @return rgba($color, if(has-alpha($color), .38, .5));
  } @else if $state == "hover" {
    @return rgba($color, if(has-alpha($color), .48, .6));
  } @else if $state == "pressed" {
    @return rgba($color, if(has-alpha($color), .6, .7));
  } @else if $state == "disabled" {
    @return rgba($color, if(has-alpha($color), .26, .3));
  } @else {
    @error "Invalid type: '#{$state}'";
  }
}
