// 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_DEVTOOLS_DEVTOOLS_UI_CONTROLLER_H_
#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_UI_CONTROLLER_H_

#include <memory>

#include "base/callback_list.h"
#include "base/memory/raw_ptr.h"
#include "ui/base/unowned_user_data/scoped_unowned_user_data.h"
#include "ui/views/focus/external_focus_tracker.h"

class BrowserWindowInterface;
class ContentsContainerView;

namespace content {
class WebContents;
}  // namespace content

namespace views {
class WebView;
}  // namespace views

// DevtoolsUIController handles managing the state of the devtools views.
class DevtoolsUIController {
 public:
  DECLARE_USER_DATA(DevtoolsUIController);

  DevtoolsUIController(
      BrowserWindowInterface* browser,
      const std::vector<raw_ptr<ContentsContainerView, DanglingUntriaged>>&
          contents_container_views);
  ~DevtoolsUIController();

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

  static DevtoolsUIController* From(BrowserWindowInterface* browser);

  void TearDown();

  bool UpdateDevtools(content::WebContents* web_contents,
                      bool update_devtools_web_contents = true);

  // Returns true if the browser window can dock a DevTools panel.
  bool CanDockDevtools() const;

  // Updates the visibility of the scrim that covers the devtools area.
  void SetDevtoolsScrimVisibility(content::WebContents* web_contents,
                                  bool visible);

 private:
  // Controller for a single DevtoolsWebView owned by |contents_container_view|.
  // Manages updating the devtools window.
  class DevtoolsWebViewController {
   public:
    explicit DevtoolsWebViewController(
        ContentsContainerView* contents_container_view);
    DevtoolsWebViewController(const DevtoolsWebViewController&) = delete;
    DevtoolsWebViewController& operator=(const DevtoolsWebViewController&) =
        delete;
    ~DevtoolsWebViewController();

    void OnWebContentsAttached(views::WebView* web_view);
    void OnWebContentsDetached(views::WebView* web_view);

    // Updates devtools window for given contents. This method will show docked
    // devtools window for inspected |web_contents| that has docked devtools
    // and hide it for null or not inspected |web_contents|. It will also make
    // sure devtools window size and position are restored for given tab.
    // This method will not update actual DevTools WebContents, if not
    // |update_devtools_web_contents|. Returns true if devtools changes
    // visibility or the resizing strategy is updated.
    bool UpdateDevtools(content::WebContents* web_contents,
                        bool update_devtools_web_contents = true);

    void RestoreFocus();

   private:
    raw_ptr<ContentsContainerView> contents_container_view_;
    // Tracks and stores the last focused view which is not the
    // devtools_web_view_ or any of its children. Used to restore focus once
    // the devtools_web_view_ is hidden.
    std::unique_ptr<views::ExternalFocusTracker> devtools_focus_tracker_;

    base::CallbackListSubscription web_contents_attached_subscription_;
    base::CallbackListSubscription web_contents_detached_subscription_;
  };

  std::map<ContentsContainerView*, std::unique_ptr<DevtoolsWebViewController>>
      devtools_web_view_controllers_;

  const bool can_dock_devtools_;

  ui::ScopedUnownedUserData<DevtoolsUIController> scoped_data_holder_;
};

#endif  // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_UI_CONTROLLER_H_
