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

#include "content/shell/browser/protocol/browser_handler.h"

#include "base/functional/bind.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/devtools_agent_host.h"
#include "content/public/browser/web_contents.h"

namespace content::shell::protocol {

namespace {

std::unique_ptr<Browser::Bounds> CreateBrowserBounds(
    WebContents* web_contents) {
  gfx::Rect bounds = web_contents->GetContainerBounds();
  return Browser::Bounds::Create()
      .SetLeft(bounds.x())
      .SetTop(bounds.y())
      .SetWidth(bounds.width())
      .SetHeight(bounds.height())
      .SetWindowState("normal")
      .Build();
}

}  // namespace

BrowserHandler::BrowserHandler(
    const raw_ref<const BrowserContext> browser_context,
    std::string target_id)
    : browser_context_(browser_context), target_id_(std::move(target_id)) {}

BrowserHandler::~BrowserHandler() = default;

void BrowserHandler::Wire(UberDispatcher* dispatcher) {
  Browser::Dispatcher::wire(dispatcher, this);
}

Response BrowserHandler::Disable() {
  return Response::Success();
}

Response BrowserHandler::GetWindowForTarget(
    std::optional<std::string> target_id,
    int* out_window_id,
    std::unique_ptr<Browser::Bounds>* out_bounds) {
  scoped_refptr<DevToolsAgentHost> agent_host =
      DevToolsAgentHost::GetForId(target_id.value_or(target_id_));
  if (!agent_host) {
    return Response::InvalidParams("No target with given id found");
  }

  WebContents* web_contents = agent_host->GetWebContents();
  if (!web_contents) {
    return Response::ServerError("No web contents for the given target id");
  }

  *out_window_id = 1;
  *out_bounds = CreateBrowserBounds(web_contents);
  return Response::Success();
}

}  // namespace content::shell::protocol
