// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/vr/model/color_scheme.h"

#include "base/lazy_instance.h"
#include "base/logging.h"
#include "chrome/browser/vr/assets_loader.h"
#include "ui/gfx/color_palette.h"

namespace vr {

namespace {

SkColor BuildColor(uint32_t color, int percentage) {
  DCHECK_GE(percentage, 0);
  DCHECK_LE(percentage, 100);
  return (static_cast<uint8_t>((2.55f * percentage + 0.5)) << 24) | color;
}

SkColor MakeColor(uint32_t color, int percentage) {
  DCHECK(!(color & 0xFF000000));
  return BuildColor(color, percentage);
}

SkColor MakeBlack(int percentage) {
  return BuildColor(0, percentage);
}

SkColor MakeWhite(int percentage) {
  return BuildColor(0xFFFFFF, percentage);
}

base::LazyInstance<ColorScheme>::Leaky g_normal_scheme =
    LAZY_INSTANCE_INITIALIZER;
base::LazyInstance<ColorScheme>::Leaky g_fullscreen_scheme =
    LAZY_INSTANCE_INITIALIZER;
base::LazyInstance<ColorScheme>::Leaky g_incognito_scheme =
    LAZY_INSTANCE_INITIALIZER;

void InitializeColorSchemes() {
  static bool initialized = false;
  if (initialized)
    return;

  ColorScheme& normal_scheme = g_normal_scheme.Get();
  normal_scheme.world_background = 0xFF999999;
  normal_scheme.floor = 0xFF8C8C8C;
  normal_scheme.ceiling = normal_scheme.floor;
  normal_scheme.floor_grid = 0x26FFFFFF;
  normal_scheme.web_vr_background = SK_ColorBLACK;
  normal_scheme.disc_button_colors.foreground = 0x87000000;
  normal_scheme.disc_button_colors.foreground_disabled = 0x33333333;
  normal_scheme.disc_button_colors.background = 0xCCB3B3B3;
  normal_scheme.disc_button_colors.background_hover = 0xCCE3E3E3;
  normal_scheme.disc_button_colors.background_down = 0xCCF3F3F3;
  normal_scheme.web_vr_floor_edge = SK_ColorBLACK;
  normal_scheme.web_vr_floor_center = 0xD9212121;
  normal_scheme.web_vr_floor_grid = 0xD9212121;
  normal_scheme.loading_indicator_foreground = MakeColor(0x4285F4, 100);
  normal_scheme.loading_indicator_background = MakeColor(0xD1E1FC, 100);
  normal_scheme.exit_warning_foreground = SK_ColorWHITE;
  normal_scheme.exit_warning_background = 0xCC1A1A1A;
  normal_scheme.web_vr_transient_toast_foreground = 0xFFF3F3F3;
  normal_scheme.web_vr_transient_toast_background = SK_ColorBLACK;
  normal_scheme.toast_foreground = 0xCCFFFFFF;
  normal_scheme.toast_background = 0xCC2F2F2F;
  normal_scheme.modal_prompt_icon_foreground = 0xFF4285F4;
  normal_scheme.modal_prompt_background = 0xFFF5F5F5;
  normal_scheme.modal_prompt_foreground = 0xFF333333;
  normal_scheme.modal_prompt_secondary_button_colors.foreground = 0xFF4285F4;
  normal_scheme.modal_prompt_secondary_button_colors.foreground_disabled =
      normal_scheme.disc_button_colors.foreground_disabled;
  normal_scheme.modal_prompt_secondary_button_colors.background =
      normal_scheme.modal_prompt_background;
  normal_scheme.modal_prompt_secondary_button_colors.background_hover =
      0x19999999;
  normal_scheme.modal_prompt_secondary_button_colors.background_down =
      0x33999999;
  normal_scheme.modal_prompt_primary_button_colors.foreground =
      normal_scheme.modal_prompt_background;
  normal_scheme.modal_prompt_secondary_button_colors.foreground_disabled =
      normal_scheme.disc_button_colors.foreground_disabled;
  normal_scheme.modal_prompt_primary_button_colors.background = 0xFF4285F4;
  normal_scheme.modal_prompt_primary_button_colors.background_hover =
      0xFF3E7DE6;
  normal_scheme.modal_prompt_primary_button_colors.background_down = 0xFF3E7DE6;
  normal_scheme.prompt_foreground = 0xCC000000;
  normal_scheme.prompt_primary_button_colors.foreground = 0xA6000000;
  normal_scheme.prompt_primary_button_colors.foreground_disabled = 0xA6000000;
  normal_scheme.prompt_primary_button_colors.background = 0xBFFFFFFF;
  normal_scheme.prompt_primary_button_colors.background_hover = 0xFFFFFFFF;
  normal_scheme.prompt_primary_button_colors.background_down = 0xE6FFFFFF;
  normal_scheme.prompt_secondary_button_colors.foreground = 0xA6000000;
  normal_scheme.prompt_secondary_button_colors.foreground_disabled = 0xA6000000;
  normal_scheme.prompt_secondary_button_colors.background = 0x66FFFFFF;
  normal_scheme.prompt_secondary_button_colors.background_hover = 0xFFFFFFFF;
  normal_scheme.prompt_secondary_button_colors.background_down = 0xE6FFFFFF;

  normal_scheme.url_bar_background = 0xCCB3B3B3;
  normal_scheme.url_bar_separator = MakeBlack(12);
  normal_scheme.url_bar_text = MakeBlack(65);
  normal_scheme.url_bar_hint_text = MakeBlack(50);
  normal_scheme.url_bar_dangerous_icon = gfx::kGoogleRed700;
  normal_scheme.url_bar_button.background = SK_ColorTRANSPARENT;
  normal_scheme.url_bar_button.background_hover = MakeBlack(8);
  normal_scheme.url_bar_button.background_down = MakeBlack(8);
  normal_scheme.url_bar_button.foreground = MakeBlack(65);
  normal_scheme.url_bar_button.foreground_disabled = MakeBlack(24);
  normal_scheme.url_text_emphasized = MakeBlack(80);
  normal_scheme.url_text_deemphasized = MakeBlack(30);
  normal_scheme.omnibox_background = 0xFFEEEEEE;
  normal_scheme.omnibox_text_selection.cursor = 0xFF5595FE;      // TODO
  normal_scheme.omnibox_text_selection.background = 0xFFC6DAFC;  // TODO
  normal_scheme.omnibox_text_selection.foreground = normal_scheme.url_bar_text;
  normal_scheme.hyperlink = MakeColor(0x4285F4, 100);

  normal_scheme.tab_item_background = normal_scheme.omnibox_background;
  normal_scheme.tab_item_text = normal_scheme.url_bar_text;
  normal_scheme.tab_mode_button_selected = normal_scheme.disc_button_colors;
  normal_scheme.tab_mode_button_selected.foreground = MakeWhite(100);
  normal_scheme.tab_mode_button_selected.background = MakeColor(0x4286F4, 100);
  normal_scheme.tab_mode_button_selected.background_hover =
      MakeColor(0x4B89ED, 100);
  normal_scheme.tab_mode_button_selected.background_down =
      MakeColor(0x5F7DAD, 100);

  normal_scheme.dimmer_inner = 0xCC0D0D0D;
  normal_scheme.dimmer_outer = 0xE6000000;
  normal_scheme.splash_screen_background = SK_ColorBLACK;
  normal_scheme.splash_screen_text_color = 0xA6FFFFFF;
  normal_scheme.web_vr_timeout_spinner = 0xFFF3F3F3;
  normal_scheme.web_vr_timeout_message_background = 0xFF444444;
  normal_scheme.web_vr_timeout_message_foreground =
      normal_scheme.web_vr_timeout_spinner;
  normal_scheme.speech_recognition_circle_background = 0xFF4285F4;
  normal_scheme.snackbar_foreground = 0xFFEEEEEE;
  normal_scheme.snackbar_background = 0xDD212121;
  normal_scheme.snackbar_button_colors.background =
      normal_scheme.snackbar_background;
  normal_scheme.snackbar_button_colors.foreground = 0xFFFFD500;
  normal_scheme.snackbar_button_colors.background_hover = 0xDD2D2D2D;
  normal_scheme.snackbar_button_colors.background_down = 0xDD2D2D2D;

  normal_scheme.controller_label_callout = SK_ColorWHITE;
  normal_scheme.controller_button = 0xFFEFEFEF;
  normal_scheme.controller_button_down = 0xFF2979FF;

  normal_scheme.reposition_label = SK_ColorWHITE;
  normal_scheme.reposition_label_background = 0xAA333333;

  normal_scheme.normal_factor = 1.0f;
  normal_scheme.incognito_factor = 0.0f;
  normal_scheme.fullscreen_factor = 0.0f;

  normal_scheme.content_reposition_frame = 0x66FFFFFF;

  normal_scheme.cursor_background_center = 0x66000000;
  normal_scheme.cursor_background_edge = SK_ColorTRANSPARENT;
  normal_scheme.cursor_foreground = SK_ColorWHITE;

  normal_scheme.webvr_permission_background = 0xD9212121;
  normal_scheme.webvr_permission_foreground = SK_ColorWHITE;

  normal_scheme.indicator.background = 0x73212121;
  normal_scheme.indicator.background_hover = 0xDE212121;
  normal_scheme.indicator.background_down = 0xDE212121;
  normal_scheme.indicator.foreground = SK_ColorWHITE;
  normal_scheme.indicator.foreground_disabled = SK_ColorWHITE;

  g_fullscreen_scheme.Get() = normal_scheme;
  ColorScheme& fullscreen_scheme = g_fullscreen_scheme.Get();
  fullscreen_scheme.world_background = 0xFF000714;
  fullscreen_scheme.floor = 0xFF070F1C;
  fullscreen_scheme.ceiling = 0xFF04080F;
  fullscreen_scheme.floor_grid = 0x40A3E0FF;

  fullscreen_scheme.disc_button_colors.foreground = 0x80FFFFFF;
  fullscreen_scheme.disc_button_colors.foreground_disabled = 0x80FFFFFF;
  fullscreen_scheme.disc_button_colors.background = 0xCC2B3E48;
  fullscreen_scheme.disc_button_colors.background_hover = 0xCC536B77;
  fullscreen_scheme.disc_button_colors.background_down = 0xCC96AFBB;

  fullscreen_scheme.normal_factor = 0.0f;
  fullscreen_scheme.incognito_factor = 0.0f;
  fullscreen_scheme.fullscreen_factor = 1.0f;

  g_incognito_scheme.Get() = normal_scheme;
  ColorScheme& incognito_scheme = g_incognito_scheme.Get();
  incognito_scheme.world_background = 0xFF2E2E2E;
  incognito_scheme.floor = 0xFF282828;
  incognito_scheme.ceiling = 0xFF2F2F2F;
  incognito_scheme.floor_grid = 0xCC595959;

  incognito_scheme.disc_button_colors.foreground = 0x80FFFFFF;
  incognito_scheme.disc_button_colors.foreground_disabled = 0x33E6E6E6;
  incognito_scheme.disc_button_colors.background = 0xCC2B3E48;
  incognito_scheme.disc_button_colors.background_hover = 0xCC505050;
  incognito_scheme.disc_button_colors.background_down = 0xCC888888;

  incognito_scheme.prompt_foreground = 0xCCFFFFFF;
  incognito_scheme.prompt_primary_button_colors.foreground = 0xD9000000;
  incognito_scheme.prompt_primary_button_colors.foreground_disabled =
      0xD9000000;
  incognito_scheme.prompt_primary_button_colors.background = 0xD9FFFFFF;
  incognito_scheme.prompt_primary_button_colors.background_hover = 0xFF8C8C8C;
  incognito_scheme.prompt_primary_button_colors.background_down = 0xE6FFFFFF;
  incognito_scheme.prompt_secondary_button_colors.foreground = 0xD9000000;
  incognito_scheme.prompt_secondary_button_colors.foreground_disabled =
      0xD9000000;
  incognito_scheme.prompt_secondary_button_colors.background = 0x80FFFFFF;
  incognito_scheme.prompt_secondary_button_colors.background_hover = 0xFF8C8C8C;
  incognito_scheme.prompt_secondary_button_colors.background_down = 0xE6FFFFFF;

  incognito_scheme.url_bar_background = 0xFF454545;
  incognito_scheme.url_bar_separator = MakeWhite(12);
  incognito_scheme.url_bar_text = MakeWhite(65);
  incognito_scheme.url_bar_hint_text = MakeWhite(50);
  incognito_scheme.url_bar_dangerous_icon = SK_ColorWHITE;
  incognito_scheme.url_bar_button.background_hover = MakeWhite(8);
  incognito_scheme.url_bar_button.background_down = MakeWhite(8);
  incognito_scheme.url_bar_button.foreground = MakeWhite(65);
  incognito_scheme.url_bar_button.foreground_disabled = MakeWhite(24);
  incognito_scheme.url_text_emphasized = MakeWhite(80);
  incognito_scheme.url_text_deemphasized = MakeWhite(30);
  incognito_scheme.omnibox_background = incognito_scheme.url_bar_background;
  incognito_scheme.omnibox_text_selection.foreground =
      incognito_scheme.url_bar_text;
  incognito_scheme.omnibox_text_selection.background = MakeWhite(8);

  incognito_scheme.tab_item_background = incognito_scheme.omnibox_background;
  incognito_scheme.tab_item_text = incognito_scheme.url_bar_text;

  incognito_scheme.normal_factor = 0.0f;
  incognito_scheme.incognito_factor = 1.0f;
  incognito_scheme.fullscreen_factor = 0.0f;

  initialized = true;
}

static constexpr size_t kButtonColorsSize = 20;

}  // namespace

ColorScheme::ColorScheme() = default;
ColorScheme::ColorScheme(const ColorScheme& other) {
  *this = other;
}

static_assert(kButtonColorsSize == sizeof(ButtonColors),
              "If the new colors are added to ButtonColors, we must explicitly "
              "bump this size and update operator== below");

bool ButtonColors::operator==(const ButtonColors& other) const {
  return background == other.background &&
         background_hover == other.background_hover &&
         background_down == other.background_down &&
         foreground == other.foreground &&
         foreground_disabled == other.foreground_disabled;
}

bool ButtonColors::operator!=(const ButtonColors& other) const {
  return !(*this == other);
}

SkColor ButtonColors::GetBackgroundColor(bool hovered, bool pressed) const {
  if (pressed)
    return background_down;
  if (hovered)
    return background_hover;
  return background;
}

SkColor ButtonColors::GetForegroundColor(bool disabled) const {
  return disabled ? foreground_disabled : foreground;
}

bool TextSelectionColors::operator==(const TextSelectionColors& other) const {
  return cursor == other.cursor && background == other.background &&
         foreground == other.foreground;
}

bool TextSelectionColors::operator!=(const TextSelectionColors& other) const {
  return !(*this == other);
}

const ColorScheme& ColorScheme::GetColorScheme(ColorScheme::Mode mode) {
  InitializeColorSchemes();
  if (mode == kModeIncognito)
    return g_incognito_scheme.Get();
  if (mode == kModeFullscreen)
    return g_fullscreen_scheme.Get();
  return g_normal_scheme.Get();
}

void ColorScheme::UpdateForComponent(const base::Version& component_version) {
  if (component_version >= AssetsLoader::MinVersionWithGradients()) {
    ColorScheme& normal_scheme = g_normal_scheme.Get();
    normal_scheme.disc_button_colors.foreground = 0xA6000000;
    normal_scheme.disc_button_colors.foreground_disabled = 0x33000000;
    normal_scheme.disc_button_colors.background = 0xFFEEEEEE;
    normal_scheme.disc_button_colors.background_hover = SK_ColorWHITE;
    normal_scheme.modal_prompt_secondary_button_colors.foreground_disabled =
        normal_scheme.disc_button_colors.foreground_disabled;
    normal_scheme.modal_prompt_secondary_button_colors.background =
        normal_scheme.modal_prompt_background;
    normal_scheme.url_bar_background = MakeColor(0xEEEEEE, 87);
    normal_scheme.omnibox_background = MakeColor(0xEEEEEE, 100);
    normal_scheme.tab_item_background = normal_scheme.omnibox_background;

    ColorScheme& incognito_scheme = g_incognito_scheme.Get();
    incognito_scheme.disc_button_colors.background = MakeColor(0x263238, 100);
    incognito_scheme.disc_button_colors.background_hover = 0xCC404A50;
    incognito_scheme.disc_button_colors.background_down = 0xCC212B31;
    incognito_scheme.url_bar_background = MakeColor(0x263238, 87);
    incognito_scheme.omnibox_background = MakeColor(0x263238, 100);
    incognito_scheme.tab_item_background = incognito_scheme.omnibox_background;
  }
}

}  // namespace vr
