// Copyright 2026 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/actor/actor_script_tool_receiver.h"

#include "chrome/browser/actor/actor_keyed_service.h"
#include "chrome/browser/actor/actor_task.h"
#include "components/actor/core/actor_features.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"

namespace actor {

// static
void ActorScriptToolReceiver::Create(
    content::RenderFrameHost* render_frame_host,
    mojo::PendingReceiver<blink::mojom::ScriptToolHost> receiver) {
  new ActorScriptToolReceiver(*render_frame_host, std::move(receiver));
}

ActorScriptToolReceiver::ActorScriptToolReceiver(
    content::RenderFrameHost& render_frame_host,
    mojo::PendingReceiver<blink::mojom::ScriptToolHost> receiver)
    : DocumentService(render_frame_host, std::move(receiver)) {}

void ActorScriptToolReceiver::PauseExecution() {
  auto* web_contents =
      content::WebContents::FromRenderFrameHost(&render_frame_host());
  if (!web_contents) {
    return;
  }

  auto* service = ActorKeyedService::Get(web_contents->GetBrowserContext());
  if (!service) {
    return;
  }

  if (const auto* task =
          service->GetActingActorTaskForWebContents(web_contents)) {
    if (auto* mutable_task = service->GetTask(task->id())) {
      // TODO(crbug.com/484367299): Implement a proper actor task state for
      // interrupt-with-user-control.
      if (base::FeatureList::IsEnabled(kActorFormScriptToolInterrupt)) {
        mutable_task->Interrupt(/*retain_user_control*/ true);
      } else {
        mutable_task->Pause(/*from_actor=*/true,
                            /*cancel_existing_action=*/false);
      }
    }
  }
}

}  // namespace actor
