// Copyright 2023 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/usb/usb_browser_test_utils.h"

#include "chrome/browser/usb/usb_chooser_controller.h"
#include "chrome/browser/usb/web_usb_chooser.h"
#include "components/permissions/chooser_controller.h"
#include "content/public/common/content_client.h"

namespace {

class FakeChooserView : public permissions::ChooserController::View {
 public:
  explicit FakeChooserView(
      std::unique_ptr<permissions::ChooserController> controller)
      : controller_(std::move(controller)) {
    controller_->set_view(this);
  }

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

  ~FakeChooserView() override { controller_->set_view(nullptr); }

  void OnOptionsInitialized() override {
    if (controller_->NumOptions()) {
      controller_->Select({0});
    } else {
      controller_->Cancel();
    }
    delete this;
  }

  void OnOptionAdded(size_t index) override { NOTREACHED(); }
  void OnOptionRemoved(size_t index) override { NOTREACHED(); }
  void OnOptionUpdated(size_t index) override { NOTREACHED(); }
  void OnAdapterEnabledChanged(bool enabled) override { NOTREACHED(); }
  void OnRefreshStateChanged(bool refreshing) override { NOTREACHED(); }

 private:
  std::unique_ptr<permissions::ChooserController> controller_;
};

class FakeUsbChooser : public WebUsbChooser {
 public:
  FakeUsbChooser() = default;
  FakeUsbChooser(const FakeUsbChooser&) = delete;
  FakeUsbChooser& operator=(const FakeUsbChooser&) = delete;
  ~FakeUsbChooser() override = default;

  void ShowChooser(content::RenderFrameHost* frame,
                   std::unique_ptr<UsbChooserController> controller) override {
    // Device list initialization in UsbChooserController may complete before
    // having a valid view in which case OnOptionsInitialized() has no chance to
    // be triggered, so select the first option directly if options are ready.
    if (controller->NumOptions()) {
      controller->Select({0});
    } else {
      new FakeChooserView(std::move(controller));
    }
  }
};

}  // namespace

TestUsbDelegate::TestUsbDelegate() = default;
TestUsbDelegate::~TestUsbDelegate() = default;

std::unique_ptr<content::UsbChooser> TestUsbDelegate::RunChooser(
    content::RenderFrameHost& frame,
    blink::mojom::WebUsbRequestDeviceOptionsPtr options,
    blink::mojom::WebUsbService::GetPermissionCallback callback) {
  if (use_fake_chooser_) {
    auto chooser = std::make_unique<FakeUsbChooser>();
    chooser->ShowChooser(&frame,
                         std::make_unique<UsbChooserController>(
                             &frame, std::move(options), std::move(callback)));
    return chooser;
  } else {
    return ChromeUsbDelegate::RunChooser(frame, std::move(options),
                                         std::move(callback));
  }
}

TestUsbContentBrowserClient::TestUsbContentBrowserClient()
    : usb_delegate_(std::make_unique<TestUsbDelegate>()) {}
TestUsbContentBrowserClient::~TestUsbContentBrowserClient() = default;

content::UsbDelegate* TestUsbContentBrowserClient::GetUsbDelegate() {
  return usb_delegate_.get();
}

void TestUsbContentBrowserClient::SetAsBrowserClient() {
  original_content_browser_client_ = content::SetBrowserClientForTesting(this);
}

void TestUsbContentBrowserClient::UnsetAsBrowserClient() {
  content::SetBrowserClientForTesting(original_content_browser_client_);
  usb_delegate_.reset();
}
