// 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_MULTI_CONTENTS_VIEW_DELEGATE_H_
#define CHROME_BROWSER_UI_VIEWS_FRAME_MULTI_CONTENTS_VIEW_DELEGATE_H_

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

class TabStripModel;
class BrowserWindowInterface;

namespace content {
class WebContents;
}  // namespace content

class MultiContentsViewDelegate
    : public MultiContentsViewDropTargetController::DropDelegate {
 public:
  ~MultiContentsViewDelegate() override = default;

  virtual void WebContentsFocused(content::WebContents* contents) = 0;
  virtual void ResizeWebContents(double ratio, bool done_resizing) = 0;
  virtual void ReverseWebContents() = 0;
};

// Executes browser and tabstrip dependent behaviors on behalf of a
// `MultiContentsView`, such as handling drag and drop entrypoints, and general
// tabstrip operations.
class MultiContentsViewDelegateImpl : public MultiContentsViewDelegate {
 public:
  explicit MultiContentsViewDelegateImpl(BrowserWindowInterface& browser);
  MultiContentsViewDelegateImpl(const MultiContentsViewDelegateImpl&) = delete;
  MultiContentsViewDelegateImpl& operator=(
      const MultiContentsViewDelegateImpl&) = delete;
  ~MultiContentsViewDelegateImpl() override = default;

  // Activates the focused contents.
  void WebContentsFocused(content::WebContents* contents) override;

  // Updates the split sizing ratio.
  // Must already be in a split.
  void ResizeWebContents(double ratio, bool done_resizing) override;

  // Reverses the order of split tabs.
  // Must already be in a split.
  void ReverseWebContents() override;

  // Creates a new tab for the first valid URL in `urls` and creates a split
  // with it and the active tab. If all URLs are blocked, then it will open
  // that.
  void HandleLinkDrop(MultiContentsDropTargetView::DropSide side,
                      const ui::DropTargetEvent& event) override;

  // Detaches a dragged tab from its current tabstrip and inserts it into a
  // split view in this delegate's tab strip.
  void HandleTabDrop(MultiContentsDropTargetView::DropSide side,
                     TabDragTarget::DragController& drag_controller) override;

 private:
  // TODO(crbug.com/431000266): Use a browser window feature instead.
  const raw_ref<BrowserWindowInterface> browser_;
  const raw_ref<TabStripModel> tab_strip_model_;
};

#endif  // CHROME_BROWSER_UI_VIEWS_FRAME_MULTI_CONTENTS_VIEW_DELEGATE_H_
