// Copyright 2019 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_AUTOFILL_TEST_TEST_AUTOFILL_BUBBLE_HANDLER_H_
#define CHROME_BROWSER_UI_AUTOFILL_TEST_TEST_AUTOFILL_BUBBLE_HANDLER_H_

#include <memory>

#include "chrome/browser/ui/autofill/autofill_bubble_base.h"
#include "chrome/browser/ui/autofill/autofill_bubble_handler.h"
#include "components/signin/public/base/signin_buildflags.h"

namespace autofill {

enum class IbanBubbleType;
enum class MandatoryReauthBubbleType;

class TestAutofillBubble final : public AutofillBubbleBase {
  void Hide() override {}
  bool IsMouseHovered() const override;
};

class TestAutofillBubbleHandler : public AutofillBubbleHandler {
 public:
  TestAutofillBubbleHandler();

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

  ~TestAutofillBubbleHandler() override;

  // AutofillBubbleHandler:
  AutofillBubbleBase* ShowSaveCreditCardBubble(
      content::WebContents* web_contents,
      SaveCardBubbleController* controller,
      bool is_user_gesture) override;
  AutofillBubbleBase* ShowIbanBubble(content::WebContents* web_contents,
                                     IbanBubbleController* controller,
                                     bool is_user_gesture,
                                     IbanBubbleType bubble_type) override;
  AutofillBubbleBase* ShowOfferNotificationBubble(
      content::WebContents* contents,
      OfferNotificationBubbleController* controller,
      bool is_user_gesture) override;
  AutofillBubbleBase* ShowSaveAutofillAiDataBubble(
      content::WebContents* web_contents,
      AutofillAiImportDataController* controller) override;
  AutofillBubbleBase* ShowAutofillAiLocalSaveNotification(
      content::WebContents* web_contents,
      AutofillAiImportDataController* controller) override;
  AutofillBubbleBase* ShowSaveAddressProfileBubble(
      content::WebContents* contents,
      std::unique_ptr<SaveAddressBubbleController> controller,
      bool is_user_gesture) override;
  AutofillBubbleBase* ShowUpdateAddressProfileBubble(
      content::WebContents* contents,
      std::unique_ptr<UpdateAddressBubbleController> controller,
      bool is_user_gesture) override;
#if BUILDFLAG(ENABLE_DICE_SUPPORT)
  AutofillBubbleBase* ShowAddressSignInPromo(
      content::WebContents* web_contents,
      const AutofillProfile& autofill_profile) override;
#endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
  AutofillBubbleBase* ShowFilledCardInformationBubble(
      content::WebContents* web_contents,
      FilledCardInformationBubbleController* controller,
      bool is_user_gesture) override;
  AutofillBubbleBase* ShowVirtualCardEnrollBubble(
      content::WebContents* web_contents,
      VirtualCardEnrollBubbleController* controller,
      bool is_user_gesture) override;
  AutofillBubbleBase* ShowVirtualCardEnrollConfirmationBubble(
      content::WebContents* web_contents,
      VirtualCardEnrollBubbleController* controller) override;
  AutofillBubbleBase* ShowMandatoryReauthBubble(
      content::WebContents* web_contents,
      MandatoryReauthBubbleController* controller,
      bool is_user_gesture,
      MandatoryReauthBubbleType bubble_type) override;
  AutofillBubbleBase* ShowSaveCardConfirmationBubble(
      content::WebContents* web_contents,
      SaveCardBubbleController* controller) override;
  AutofillBubbleBase* ShowSaveIbanConfirmationBubble(
      content::WebContents* web_contents,
      IbanBubbleController* controller) override;
  AutofillBubbleBase* ShowOmniboxAutofillBubble(
      content::WebContents* web_contents,
      OmniboxAutofillBubbleController* controller) override;
  AutofillBubbleBase* ShowPaymentsChurnedUsersBubble(
      content::WebContents* web_contents,
      PaymentsChurnedUsersBubbleController* controller,
      bool is_user_gesture) override;
  AutofillBubbleBase* ShowPaymentsChurnedUsersConfirmationBubble(
      content::WebContents* web_contents,
      PaymentsChurnedUsersBubbleController* controller) override;
  AutofillBubbleBase* ShowWalletReminderNoticeBubble(
      content::WebContents* web_contents,
      WalletReminderNoticeBubbleController* controller,
      bool is_user_gesture) override;

 private:
  std::unique_ptr<TestAutofillBubble> local_card_migration_bubble_view_;
  std::unique_ptr<TestAutofillBubble> offer_notification_bubble_view_;
  std::unique_ptr<TestAutofillBubble> save_card_bubble_view_;
  std::unique_ptr<TestAutofillBubble> iban_bubble_view_;
  std::unique_ptr<TestAutofillBubble> save_address_profile_bubble_view_;
  std::unique_ptr<TestAutofillBubble> update_address_profile_bubble_view_;
  std::unique_ptr<TestAutofillBubble> address_sign_in_promo_bubble_view_;
  std::unique_ptr<TestAutofillBubble> save_autofill_ai_data_bubble_view_;
  std::unique_ptr<TestAutofillBubble> autofill_ai_local_save_notification_view_;
  std::unique_ptr<TestAutofillBubble> edit_address_profile_bubble_view_;
  std::unique_ptr<TestAutofillBubble> filled_card_information_bubble_view_;
  std::unique_ptr<TestAutofillBubble> virtual_card_enroll_bubble_view_;
  std::unique_ptr<TestAutofillBubble>
      virtual_card_enroll_confirmation_bubble_view_;
  std::unique_ptr<TestAutofillBubble> mandatory_reauth_bubble_view_;
  std::unique_ptr<TestAutofillBubble> save_card_confirmation_bubble_view_;
  std::unique_ptr<TestAutofillBubble> save_iban_confirmation_bubble_view_;
  std::unique_ptr<TestAutofillBubble> omnibox_autofill_bubble_view_;
  std::unique_ptr<TestAutofillBubble> payments_churned_users_bubble_view_;
  std::unique_ptr<TestAutofillBubble>
      payments_churned_users_confirmation_bubble_view_;
  std::unique_ptr<TestAutofillBubble> wallet_reminder_notice_bubble_view_;
};

}  // namespace autofill

#endif  // CHROME_BROWSER_UI_AUTOFILL_TEST_TEST_AUTOFILL_BUBBLE_HANDLER_H_
