// 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.

#include "chrome/browser/ui/views/frame/find_bar_owner_views.h"

#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser_window/public/browser_window_features.h"
#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
#include "chrome/browser/ui/find_bar/find_bar_controller.h"
#include "chrome/browser/ui/immersive/immersive_mode_controller.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/translate/translate_bubble_controller.h"
#include "chrome/browser/ui/window_metadata/window_metadata_controller.h"
#include "components/strings/grit/components_strings.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/views/widget/widget.h"

FindBarOwnerViews::FindBarOwnerViews(BrowserView* browser_view,
                                     ui::UnownedUserDataHost& host)
    : FindBarOwner(host), browser_view_(browser_view) {}

FindBarOwnerViews::~FindBarOwnerViews() = default;

views::Widget* FindBarOwnerViews::GetOwnerWidget() {
  return browser_view_->GetWidget();
}

gfx::Rect FindBarOwnerViews::GetFindBarBoundingBox() {
  return browser_view_->GetFindBarBoundingBox();
}

gfx::Rect FindBarOwnerViews::GetFindBarClippingBox() {
  return browser_view_->bounds();
}

bool FindBarOwnerViews::IsOffTheRecord() const {
  return browser_view_->browser()->GetProfile()->IsOffTheRecord();
}

views::Widget* FindBarOwnerViews::GetWidgetForAnchoring() {
  return browser_view_->GetWidgetForAnchoring();
}

std::u16string FindBarOwnerViews::GetFindBarAccessibleWindowTitle() {
  return l10n_util::GetStringFUTF16(
      IDS_FIND_IN_PAGE_ACCESSIBLE_TITLE,
      WindowMetadataController::From(browser_view_->browser())
          ->GetWindowTitleForCurrentTab(false));
}

void FindBarOwnerViews::OnFindBarVisibilityChanged(gfx::Rect visible_bounds) {
  // Tell the immersive mode controller about the find bar's new bounds. The
  // immersive mode controller uses the bounds to keep the top-of-window views
  // revealed when the mouse is hovered over the find bar.
  ImmersiveModeController::From(browser_view_->browser())
      ->OnFindBarVisibleBoundsChanged(visible_bounds);
  browser_view_->browser()
      ->GetFeatures()
      .GetFindBarController()
      ->OnFindBarVisibilityChanged();
}

void FindBarOwnerViews::CloseOverlappingBubbles() {
  if (TranslateBubbleController* controller =
      TranslateBubbleController::From(browser_view_->browser())) {
    controller->CloseBubble();
  }
}
