// 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 "chrome/browser/ui/views/location_bar/content_setting_image_view.h"

#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
#include "chrome/browser/ui/content_settings/content_setting_image_model.h"
#include "chrome/browser/ui/interaction/browser_elements.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.h"
#include "chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_view.h"
#include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
#include "chrome/browser/web_applications/test/os_integration_test_override_impl.h"
#include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
#include "chrome/test/permissions/permission_request_manager_test_api.h"
#include "chrome/test/user_education/interactive_feature_promo_test.h"
#include "components/permissions/test/mock_permission_ui_selector.h"
#include "content/public/test/browser_test.h"
#include "net/dns/mock_host_resolver.h"
#include "ui/base/interaction/element_identifier.h"
#include "url/gurl.h"

namespace {

class LocationBarViewQuietNotificationInteractiveUITest
    : public InteractiveFeaturePromoTest,
      public testing::WithParamInterface<bool> {
 public:
  // IPH feature should be explicitly enabled in test.
  LocationBarViewQuietNotificationInteractiveUITest()
      : InteractiveFeaturePromoTest(UseDefaultTrackerAllowingPromos(
            {feature_engagement::kIPHPwaQuietNotificationFeature})) {
    https_server_ = std::make_unique<net::EmbeddedTestServer>(
        net::EmbeddedTestServer::TYPE_HTTPS);
  }

  void SetUp() override {
    https_server()->SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES);
    https_server()->ServeFilesFromSourceDirectory(GetChromeTestDataDir());

    ASSERT_TRUE(https_server()->InitializeAndListen());
    InteractiveFeaturePromoTest::SetUp();
  }

  void SetUpOnMainThread() override {
    InteractiveFeaturePromoTest::SetUpOnMainThread();

    host_resolver()->AddRule("*", "127.0.0.1");
    https_server()->StartAcceptingConnections();
  }

  void TearDownOnMainThread() override {
    EXPECT_TRUE(https_server()->ShutdownAndWaitUntilComplete());
    InteractiveFeaturePromoTest::TearDownOnMainThread();
  }

  void GetContentSettingViews() {
    content_setting_views_ =
        &helper()->web_app_frame_toolbar()->GetContentSettingViewsForTesting();
  }

  ContentSettingImageView* GetNotificationView() {
    return *std::ranges::find(
        *content_setting_views_,
        ContentSettingImageModel::ImageType::kNotifications,
        &ContentSettingImageView::GetType);
  }

  void InstallAndLaunchWebApp() {
    helper()->InstallAndLaunchWebApp(browser(), GetURL());

    // `PermissionRequestManagerTestApi` should be set after WebApp is
    // installed.
    test_api_ = std::make_unique<test::PermissionRequestManagerTestApi>(
        helper()->app_browser());
  }

  ui::ElementContext GetAppWindowElementContext() {
    return BrowserElements::From(helper()->app_browser())->GetContext();
  }

  GURL GetURL() {
    return https_server()->GetURL("a.test", "/permissions/requests.html");
  }

  net::EmbeddedTestServer* https_server() { return https_server_.get(); }

  void SetCannedUiDecision() {
    test_api_->manager()->set_permission_ui_selector_for_testing(
        std::make_unique<MockPermissionUiSelector>(
            permissions::PermissionUiSelector::Decision::UseQuietUi(
                permissions::PermissionUiSelector::QuietUiReason::
                    kEnabledInPrefs,
                std::nullopt)));
  }

 private:
  WebAppFrameToolbarTestHelper* helper() {
    return &web_app_frame_toolbar_helper_;
  }

  WebAppFrameToolbarTestHelper web_app_frame_toolbar_helper_;
  raw_ptr<
      const std::vector<raw_ptr<ContentSettingImageView, VectorExperimental>>,
      DanglingUntriaged>
      content_setting_views_ = nullptr;
  std::unique_ptr<test::PermissionRequestManagerTestApi> test_api_;
  web_app::OsIntegrationTestOverrideBlockingRegistration faked_os_integration_;
  std::unique_ptr<net::EmbeddedTestServer> https_server_;
};

IN_PROC_BROWSER_TEST_F(LocationBarViewQuietNotificationInteractiveUITest,
                       QuietNotificationIPH) {
  DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kContentsWebViewsElementId);
  InstallAndLaunchWebApp();
  SetCannedUiDecision();
  RunTestSequenceInContext(
      GetAppWindowElementContext(), InstrumentTab(kContentsWebViewsElementId),
      ExecuteJs(kContentsWebViewsElementId, "requestNotification"),
      WaitForPromo(feature_engagement::kIPHPwaQuietNotificationFeature));
}

}  // namespace
