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

#ifndef CHROME_BROWSER_UI_VIEWS_FRAME_CONTENTS_CONTAINER_OUTLINE_H_
#define CHROME_BROWSER_UI_VIEWS_FRAME_CONTENTS_CONTAINER_OUTLINE_H_

#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/ui/color/chrome_color_id.h"
#include "ui/views/view.h"
#include "ui/views/view_observer.h"

// This view draws the outline of the contents container view. Because the
// outline is drawn over the mini toolbar we cannot use a standard border.
// It's also important for the outline to be draw as a single path to avoid
// issuess with fractional display scale factors.
class ContentsContainerOutline : public views::View,
                                 public views::ViewObserver {
  METADATA_HEADER(ContentsContainerOutline, views::View)

 public:
  static constexpr int kCornerRadius = 8;
  static constexpr int kThickness = 1;
  static constexpr int kHighlightThickness = 3;

  explicit ContentsContainerOutline(views::View* mini_toolbar);
  ContentsContainerOutline(ContentsContainerOutline&) = delete;
  ContentsContainerOutline& operator=(const ContentsContainerOutline&) = delete;
  ~ContentsContainerOutline() override;

  static int GetThickness(bool is_highlighted);
  static ui::ColorId GetColor(bool is_active, bool is_highlighted);
  static SkPath GetPath(const gfx::RectF& local_bounds,
                        float corner_radius,
                        float mini_toolbar_corner_radius,
                        const gfx::SizeF& mini_toolbar_size);

  bool is_highlighted() const { return is_highlighted_; }

  void UpdateState(bool is_active, bool is_highlighted);

 private:
  void SetClipPath();

  // views::View
  void OnPaint(gfx::Canvas* canvas) override;

  // views::ViewObserver:
  void OnViewBoundsChanged(views::View* observed_view) override;
  void OnViewIsDeleting(views::View* observed_view) override;

  raw_ptr<views::View> mini_toolbar_ = nullptr;
  bool is_active_ = false;
  bool is_highlighted_ = false;
  base::ScopedObservation<views::View, views::ViewObserver>
      view_bounds_observer_{this};
};

#endif  // CHROME_BROWSER_UI_VIEWS_FRAME_CONTENTS_CONTAINER_OUTLINE_H_
