// Copyright (c) 2012 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 "ui/native_theme/common_theme.h"

#include "base/logging.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/color_utils.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/skia_util.h"

namespace ui {

SkColor GetAuraColor(NativeTheme::ColorId color_id,
                     const NativeTheme* base_theme) {
  // High contrast overrides the normal colors for certain ColorIds to be much
  // darker or lighter.
  if (base_theme->UsesHighContrastColors()) {
    switch (color_id) {
      case NativeTheme::kColorId_ButtonEnabledColor:
      case NativeTheme::kColorId_ButtonHoverColor:
      case NativeTheme::kColorId_MenuBorderColor:
      case NativeTheme::kColorId_MenuSeparatorColor:
      case NativeTheme::kColorId_SeparatorColor:
      case NativeTheme::kColorId_UnfocusedBorderColor:
      case NativeTheme::kColorId_TabBottomBorder:
        return base_theme->SystemDarkModeEnabled() ? SK_ColorWHITE
                                                   : SK_ColorBLACK;
      case NativeTheme::kColorId_FocusedBorderColor:
      case NativeTheme::kColorId_ProminentButtonColor:
        return base_theme->SystemDarkModeEnabled() ? gfx::kGoogleBlue100
                                                   : gfx::kGoogleBlue900;
      default:
        break;
    }
  }

  if (base_theme->SystemDarkModeEnabled()) {
    switch (color_id) {
      case NativeTheme::kColorId_LabelEnabledColor:
      case NativeTheme::kColorId_TextfieldDefaultColor:
      case NativeTheme::kColorId_SelectedMenuItemForegroundColor:
        return SkColorSetA(SK_ColorWHITE, 0xDD);
      case NativeTheme::kColorId_UnfocusedBorderColor:
        return SK_ColorTRANSPARENT;
      case NativeTheme::kColorId_ButtonEnabledColor:
      case NativeTheme::kColorId_ButtonHoverColor:
        return gfx::kGoogleGrey200;
      case NativeTheme::kColorId_FocusedMenuItemBackgroundColor:
      case NativeTheme::kColorId_FocusedHighlightedMenuItemBackgroundColor:
        return SkColorSetA(gfx::kGoogleGrey800, 0x99);
      case NativeTheme::kColorId_MenuBackgroundColor:
      case NativeTheme::kColorId_BubbleBackground:
      case NativeTheme::kColorId_DialogBackground:
        return color_utils::AlphaBlend(SK_ColorWHITE, gfx::kGoogleGrey900,
                                       0.04f);
      case NativeTheme::kColorId_ProminentButtonColor:
        return gfx::kGoogleBlue300;
      case NativeTheme::kColorId_TextOnProminentButtonColor:
        return gfx::kGoogleGrey900;
      case NativeTheme::kColorId_ProminentButtonDisabledColor:
        return gfx::kGoogleGrey800;
      case NativeTheme::kColorId_ButtonBorderColor:
        return gfx::kGoogleGrey700;
      case NativeTheme::kColorId_TextfieldSelectionColor:
      case NativeTheme::kColorId_LabelTextSelectionColor:
        return color_utils::AlphaBlend(
            SK_ColorWHITE,
            GetAuraColor(
                NativeTheme::kColorId_LabelTextSelectionBackgroundFocused,
                base_theme),
            SkAlpha{0xDD});
      case NativeTheme::kColorId_MenuSeparatorColor:
      case NativeTheme::kColorId_SeparatorColor:
        return SkColorSetA(gfx::kGoogleGrey800, 0xCC);
      case NativeTheme::kColorId_TextfieldDefaultBackground:
        return SkColorSetA(SK_ColorBLACK, 0x4D);
      case NativeTheme::kColorId_LinkEnabled:
      case NativeTheme::kColorId_LinkPressed:
        return gfx::kGoogleBlue300;

      default:
        break;
    }
  }

  // Second wave of MD colors (colors that only appear in secondary UI).
  constexpr SkColor kPrimaryTextColor = gfx::kGoogleGrey900;

  switch (color_id) {
    // Labels
    case NativeTheme::kColorId_LabelEnabledColor:
      return kPrimaryTextColor;
    case NativeTheme::kColorId_LabelDisabledColor:
      return SkColorSetA(
          base_theme->GetSystemColor(NativeTheme::kColorId_LabelEnabledColor),
          gfx::kDisabledControlAlpha);

    // FocusableBorder
    case NativeTheme::kColorId_UnfocusedBorderColor:
      return SkColorSetA(SK_ColorBLACK, 0x4e);

    // Textfields
    case NativeTheme::kColorId_TextfieldDefaultColor:
      return kPrimaryTextColor;
    case NativeTheme::kColorId_TextfieldDefaultBackground:
      return base_theme->GetSystemColor(NativeTheme::kColorId_DialogBackground);
    case NativeTheme::kColorId_TextfieldReadOnlyColor:
      return SkColorSetA(base_theme->GetSystemColor(
                             NativeTheme::kColorId_TextfieldDefaultColor),
                         gfx::kDisabledControlAlpha);

    default:
      break;
  }

  // Shared constant for disabled text.
  constexpr SkColor kDisabledTextColor = gfx::kGoogleGrey600;

  // Buttons:
  constexpr SkColor kButtonEnabledColor = gfx::kChromeIconGrey;
  // Text selection colors:
  constexpr SkColor kTextSelectionBackgroundFocused =
      SkColorSetARGB(0x54, 0x60, 0xA8, 0xEB);
  static const SkColor kTextSelectionColor = color_utils::AlphaBlend(
      SK_ColorBLACK, kTextSelectionBackgroundFocused, SkAlpha{0xDD});

  switch (color_id) {
    // Dialogs
    case NativeTheme::kColorId_WindowBackground:
    case NativeTheme::kColorId_DialogBackground:
    case NativeTheme::kColorId_BubbleBackground:
      return SK_ColorWHITE;

    // Buttons
    case NativeTheme::kColorId_ButtonEnabledColor:
    case NativeTheme::kColorId_ButtonHoverColor:
      return kButtonEnabledColor;
    case NativeTheme::kColorId_ProminentButtonFocusedColor:
      return gfx::kGoogleBlue400;
    case NativeTheme::kColorId_ProminentButtonColor:
      return gfx::kGoogleBlue500;
    case NativeTheme::kColorId_TextOnProminentButtonColor:
      return SK_ColorWHITE;
    case NativeTheme::kColorId_ButtonPressedShade:
      return SK_ColorTRANSPARENT;
    case NativeTheme::kColorId_ButtonDisabledColor:
      return kDisabledTextColor;
    case NativeTheme::kColorId_ProminentButtonDisabledColor:
      return gfx::kGoogleGrey100;
    case NativeTheme::kColorId_ButtonBorderColor:
      return gfx::kGoogleGrey300;

    // MenuItem
    case NativeTheme::kColorId_TouchableMenuItemLabelColor:
      return gfx::kGoogleGrey900;
    case NativeTheme::kColorId_ActionableSubmenuVerticalSeparatorColor:
      return SkColorSetA(gfx::kGoogleGrey900, 0x24);
    case NativeTheme::kColorId_SelectedMenuItemForegroundColor:
    case NativeTheme::kColorId_EnabledMenuItemForegroundColor:
      return SK_ColorBLACK;
    case NativeTheme::kColorId_MenuBorderColor:
      return SkColorSetRGB(0xBA, 0xBA, 0xBA);
    case NativeTheme::kColorId_MenuSeparatorColor:
      return gfx::kGoogleGrey200;
    case NativeTheme::kColorId_MenuBackgroundColor:
      return SK_ColorWHITE;
    case NativeTheme::kColorId_FocusedMenuItemBackgroundColor:
      return gfx::kGoogleGrey200;
    case NativeTheme::kColorId_DisabledMenuItemForegroundColor:
      return kDisabledTextColor;
    case NativeTheme::kColorId_MenuItemMinorTextColor:
      return SkColorSetA(SK_ColorBLACK, 0x89);
    case NativeTheme::kColorId_HighlightedMenuItemBackgroundColor:
      return gfx::kGoogleGrey050;
    case NativeTheme::kColorId_HighlightedMenuItemForegroundColor:
      return gfx::kGoogleGrey900;
    case NativeTheme::kColorId_FocusedHighlightedMenuItemBackgroundColor:
      return gfx::kGoogleGrey200;
    case NativeTheme::kColorId_MenuItemAlertBackgroundColor:
      return SkColorSetA(gfx::kGoogleBlue600, 0x1A);

    // Label
    case NativeTheme::kColorId_LabelEnabledColor:
      return kButtonEnabledColor;
    case NativeTheme::kColorId_LabelDisabledColor:
      return base_theme->GetSystemColor(
          NativeTheme::kColorId_ButtonDisabledColor);
    case NativeTheme::kColorId_LabelTextSelectionColor:
      return kTextSelectionColor;
    case NativeTheme::kColorId_LabelTextSelectionBackgroundFocused:
      return kTextSelectionBackgroundFocused;

    // Link
    // TODO(estade): where, if anywhere, do we use disabled links in Chrome?
    case NativeTheme::kColorId_LinkDisabled:
      return SK_ColorBLACK;

    case NativeTheme::kColorId_LinkEnabled:
    case NativeTheme::kColorId_LinkPressed:
      return gfx::kGoogleBlue700;

    // Separator
    case NativeTheme::kColorId_SeparatorColor:
      return SkColorSetRGB(0xE9, 0xE9, 0xE9);

    // TabbedPane
    case NativeTheme::kColorId_TabTitleColorActive:
      return SkColorSetRGB(0x42, 0x85, 0xF4);
    case NativeTheme::kColorId_TabTitleColorInactive:
      return SkColorSetRGB(0x75, 0x75, 0x75);
    case NativeTheme::kColorId_TabBottomBorder:
      return SkColorSetA(SK_ColorBLACK, 0x1E);

    // Textfield
    case NativeTheme::kColorId_TextfieldDefaultColor:
      return SK_ColorBLACK;
    case NativeTheme::kColorId_TextfieldDefaultBackground:
    case NativeTheme::kColorId_TextfieldReadOnlyBackground:
      return SK_ColorWHITE;
    case NativeTheme::kColorId_TextfieldReadOnlyColor:
      return kDisabledTextColor;
    case NativeTheme::kColorId_TextfieldSelectionColor:
      return kTextSelectionColor;
    case NativeTheme::kColorId_TextfieldSelectionBackgroundFocused:
      return kTextSelectionBackgroundFocused;

    // Tooltip
    case NativeTheme::kColorId_TooltipBackground:
      return SkColorSetA(SK_ColorBLACK, 0xCC);
    case NativeTheme::kColorId_TooltipText:
      return SkColorSetA(SK_ColorWHITE, 0xDE);

    // Tree
    case NativeTheme::kColorId_TreeBackground:
      return SK_ColorWHITE;
    case NativeTheme::kColorId_TreeText:
    case NativeTheme::kColorId_TreeSelectedText:
    case NativeTheme::kColorId_TreeSelectedTextUnfocused:
      return SK_ColorBLACK;
    case NativeTheme::kColorId_TreeSelectionBackgroundFocused:
    case NativeTheme::kColorId_TreeSelectionBackgroundUnfocused:
      return SkColorSetRGB(0xEE, 0xEE, 0xEE);

    // Table
    case NativeTheme::kColorId_TableBackground:
      return SK_ColorWHITE;
    case NativeTheme::kColorId_TableText:
    case NativeTheme::kColorId_TableSelectedText:
    case NativeTheme::kColorId_TableSelectedTextUnfocused:
      return SK_ColorBLACK;
    case NativeTheme::kColorId_TableSelectionBackgroundFocused:
    case NativeTheme::kColorId_TableSelectionBackgroundUnfocused:
      return SkColorSetRGB(0xEE, 0xEE, 0xEE);
    case NativeTheme::kColorId_TableGroupingIndicatorColor:
      return SkColorSetRGB(0xCC, 0xCC, 0xCC);

    // Table Header
    case NativeTheme::kColorId_TableHeaderText:
      return base_theme->GetSystemColor(
          NativeTheme::kColorId_EnabledMenuItemForegroundColor);
    case NativeTheme::kColorId_TableHeaderBackground:
      return base_theme->GetSystemColor(
          NativeTheme::kColorId_MenuBackgroundColor);
    case NativeTheme::kColorId_TableHeaderSeparator:
      return base_theme->GetSystemColor(NativeTheme::kColorId_MenuBorderColor);

    // FocusableBorder
    case NativeTheme::kColorId_FocusedBorderColor:
      return gfx::kGoogleBlue500;
    case NativeTheme::kColorId_UnfocusedBorderColor:
      return SkColorSetA(SK_ColorBLACK, 0x66);

    // Results Tables
    case NativeTheme::kColorId_ResultsTableNormalBackground:
      return SK_ColorWHITE;
    case NativeTheme::kColorId_ResultsTableHoveredBackground:
      return SkColorSetA(base_theme->GetSystemColor(
                             NativeTheme::kColorId_ResultsTableNormalText),
                         0x0D);
    case NativeTheme::kColorId_ResultsTableNormalText:
      return SK_ColorBLACK;
    case NativeTheme::kColorId_ResultsTableDimmedText:
      return SkColorSetRGB(0x64, 0x64, 0x64);

    // Material spinner/throbber
    case NativeTheme::kColorId_ThrobberSpinningColor:
      return gfx::kGoogleBlue600;
    case NativeTheme::kColorId_ThrobberWaitingColor:
      return SkColorSetRGB(0xA6, 0xA6, 0xA6);
    case NativeTheme::kColorId_ThrobberLightColor:
      return SkColorSetRGB(0xF4, 0xF8, 0xFD);

    // Alert icon colors
    case NativeTheme::kColorId_AlertSeverityLow:
      return gfx::kGoogleGreen600;
    case NativeTheme::kColorId_AlertSeverityMedium:
      return gfx::kGoogleYellow700;
    case NativeTheme::kColorId_AlertSeverityHigh:
      return gfx::kGoogleRed600;

    case NativeTheme::kColorId_NumColors:
      break;
  }

  NOTREACHED();
  return gfx::kPlaceholderColor;
}

void CommonThemePaintMenuItemBackground(
    const NativeTheme* theme,
    cc::PaintCanvas* canvas,
    NativeTheme::State state,
    const gfx::Rect& rect,
    const NativeTheme::MenuItemExtraParams& menu_item) {
  cc::PaintFlags flags;
  switch (state) {
    case NativeTheme::kNormal:
    case NativeTheme::kDisabled:
      flags.setColor(
          theme->GetSystemColor(NativeTheme::kColorId_MenuBackgroundColor));
      break;
    case NativeTheme::kHovered:
      flags.setColor(theme->GetSystemColor(
          NativeTheme::kColorId_FocusedMenuItemBackgroundColor));
      break;
    default:
      NOTREACHED() << "Invalid state " << state;
      break;
  }
  if (menu_item.corner_radius > 0) {
    const SkScalar radius = SkIntToScalar(menu_item.corner_radius);
    canvas->drawRoundRect(gfx::RectToSkRect(rect), radius, radius, flags);
    return;
  }
  canvas->drawRect(gfx::RectToSkRect(rect), flags);
}

}  // namespace ui
