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

#ifndef UI_NATIVE_THEME_NATIVE_THEME_FLUENT_H_
#define UI_NATIVE_THEME_NATIVE_THEME_FLUENT_H_

#include <optional>

#include "base/component_export.h"
#include "base/no_destructor.h"
#include "third_party/skia/include/core/SkRefCnt.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/native_theme/native_theme_base.h"

class SkTypeface;

namespace cc {
class PaintCanvas;
}

namespace gfx {
class Rect;
}

namespace ui {

class ColorProvider;
class NativeThemeFluentTest;

class COMPONENT_EXPORT(NATIVE_THEME) NativeThemeFluent
    : public NativeThemeBase {
 public:
  // LINT.IfChange(FluentScrollbarThickness)
  static constexpr int kScrollbarThickness = 15;
  // LINT.ThenChange(//third_party/blink/web_tests/resources/scrollbar-util.js:FluentScrollbarThickness)

  // Button height for the vertical scrollbar or width for the horizontal.
  static constexpr int kScrollbarButtonSideLength = 18;

  NativeThemeFluent(const NativeThemeFluent&) = delete;
  NativeThemeFluent& operator=(const NativeThemeFluent&) = delete;

  // NativeThemeBase:
  int GetPaintedScrollbarTrackInset() const override;

  // Gets whether an arrow icon is available. The setter overrides availability
  // for metric computations in tests.
  bool IsArrowIconAvailable(Part part) const;
  void SetArrowIconsAvailableForTesting(bool available);

 protected:
  NativeThemeFluent();
  ~NativeThemeFluent() override;

  // NativeThemeBase:
  gfx::Size GetVerticalScrollbarButtonSize() const override;
  gfx::Size GetVerticalScrollbarThumbSize() const override;
  gfx::RectF GetArrowRect(const gfx::Rect& rect,
                          Part part,
                          State state) const override;
  std::optional<ColorId> GetScrollbarThumbColorId(
      State state,
      const ScrollbarThumbExtraParams& extra_params) const override;
  float GetScrollbarPartContrastRatioForState(State state) const override;
  SkColor GetScrollbarArrowBackgroundColor(
      const ScrollbarArrowExtraParams& extra_params,
      State state,
      bool dark_mode,
      PreferredContrast contrast,
      const ColorProvider* color_provider) const override;
  void PaintArrowButton(
      cc::PaintCanvas* canvas,
      const ColorProvider* color_provider,
      const gfx::Rect& rect,
      Part part,
      State state,
      bool forced_colors,
      bool dark_mode,
      PreferredContrast contrast,
      const ScrollbarArrowExtraParams& extra_params) const override;
  void PaintScrollbarThumb(
      cc::PaintCanvas* canvas,
      const ColorProvider* color_provider,
      Part part,
      State state,
      const gfx::Rect& rect,
      const ScrollbarThumbExtraParams& extra_params) const override;
  void PaintScrollbarTrack(cc::PaintCanvas* canvas,
                           const ColorProvider* color_provider,
                           Part part,
                           State state,
                           const ScrollbarTrackExtraParams& extra_params,
                           const gfx::Rect& rect,
                           bool forced_colors,
                           PreferredContrast contrast) const override;
  void PaintScrollbarCorner(
      cc::PaintCanvas* canvas,
      const ColorProvider* color_provider,
      State state,
      const gfx::Rect& rect,
      const ScrollbarTrackExtraParams& extra_params) const override;

 private:
  friend class base::NoDestructor<NativeThemeFluent>;
  friend class NativeThemeFluentTest;

  // Returns the typeface to use for arrow icons. May return null if the
  // typeface is not available. Lazily loads the typeface on first call.
  sk_sp<SkTypeface> GetArrowIconTypeface() const;

  // Returns the glyph to use for an arrow icon, or 0 if it is unavailable.
  SkGlyphID GetArrowGlyph(Part part) const;

  // The typeface which contains arrow icons. Because `GetArrowIconTypeface()`
  // lazily loads, a null optional means "no load attempted" while a null
  // pointer inside the optional means "load failed and will not be retried".
  mutable std::optional<sk_sp<SkTypeface>> typeface_;

  // Overrides glyph availability for geometry tests.
  std::optional<bool> arrow_icons_available_for_testing_;
};

}  // namespace ui

#endif  // UI_NATIVE_THEME_NATIVE_THEME_FLUENT_H_
