// 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 <string>

#include "base/android/jni_android.h"
#include "base/android/scoped_java_ref.h"
#include "chrome/browser/ui/android/extensions/extensions_toolbar_android.h"
#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
#include "chrome/browser/ui/extensions/extensions_menu_handler.h"
#include "chrome/browser/ui/extensions/extensions_menu_view_model.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "url/origin.h"

#ifndef CHROME_BROWSER_UI_ANDROID_EXTENSIONS_EXTENSIONS_MENU_DELEGATE_ANDROID_H_
#define CHROME_BROWSER_UI_ANDROID_EXTENSIONS_EXTENSIONS_MENU_DELEGATE_ANDROID_H_

namespace extensions {

// Implements Android-specific extensions menu UI logic. Acts as the JNI bridge
// for the extensions menu. This bridge is created and owned by Java UI code.
class ExtensionsMenuDelegateAndroid : public ExtensionsMenuViewModel::Delegate,
                                      public ExtensionsMenuViewModel::Observer,
                                      public ExtensionsMenuHandler {
 public:
  ExtensionsMenuDelegateAndroid(
      BrowserWindowInterface* browser,
      ExtensionsToolbarAndroid* toolbar_android,
      const base::android::JavaRef<jobject>& java_object);
  ExtensionsMenuDelegateAndroid(const ExtensionsMenuDelegateAndroid&) = delete;
  const ExtensionsMenuDelegateAndroid& operator=(
      const ExtensionsMenuDelegateAndroid&) = delete;
  ~ExtensionsMenuDelegateAndroid() override;

  // JNI implementations:
  void Destroy(JNIEnv* env);
  void ExecuteAction(JNIEnv* env, const extensions::ExtensionId& extension_id);
  base::android::ScopedJavaLocalRef<jobject> GetActionIcon(JNIEnv* env,
                                                           int action_index);
  base::android::ScopedJavaLocalRef<jobject> GetExtensionSitePermissionsState(
      JNIEnv* env,
      const std::string& extension_id);
  base::android::ScopedJavaLocalRef<jobject> GetMenuEntry(JNIEnv* env,
                                                          int action_index);
  std::vector<base::android::ScopedJavaLocalRef<jobject>> GetMenuEntries(
      JNIEnv* env);
  base::android::ScopedJavaLocalRef<jobject> GetSiteSettings(JNIEnv* env);
  int GetOptionalSection(JNIEnv* env);
  std::vector<base::android::ScopedJavaLocalRef<jobject>> GetHostAccessRequests(
      JNIEnv* env);
  bool IsReady(JNIEnv* env);
  void OnReloadPageButtonClicked(JNIEnv* env);
  void OnSiteSettingsToggleChanged(JNIEnv* env, bool is_checked);
  void OnExtensionToggleSelected(JNIEnv* env,
                                 const std::string& extension_id,
                                 const std::string& origin,
                                 bool is_on);
  void OnSiteAccessSelected(
      JNIEnv* env,
      const std::string& extension_id,
      const std::string& origin,
      extensions::PermissionsManager::UserSiteAccess site_access);

  // ExtensionsMenuViewModel::Delegate:
  std::unique_ptr<ExtensionActionViewModel> CreateActionViewModel(
      const extensions::ExtensionId& extension_id) override;

  // ExtensionsMenuViewModel::Observer:
  void OnPageNavigation() override;
  void OnActionAdded(ExtensionActionViewModel* action_model,
                     int index) override;
  void OnActionIconUpdated(const ToolbarActionsModel::ActionId& action_id,
                           int index) override;
  void OnActionRemoved(const ToolbarActionsModel::ActionId& action_id,
                       int index) override;
  void OnActionUpdated(const ToolbarActionsModel::ActionId& action_id,
                       int index) override;
  void OnActionsInitialized() override;
  void OnHostAccessRequestAdded(const extensions::ExtensionId& extension_id,
                                int index) override;
  void OnHostAccessRequestUpdated(const extensions::ExtensionId& extension_id,
                                  int index) override;
  void OnHostAccessRequestsCleared() override;
  void OnHostAccessRequestRemoved(const extensions::ExtensionId& extension_id,
                                  int index) override;
  void OnShowHostAccessRequestsInToolbarChanged(
      const extensions::ExtensionId& extension_id,
      bool can_show_requests) override;
  void OnToolbarPinnedActionsChanged() override;
  void OnUserPermissionsSettingsChanged() override;

  // ExtensionsMenuHandler:
  void CloseBubble() override;
  void OnActionButtonClicked(
      const extensions::ExtensionId& extension_id) override;
  void OnAllowExtensionClicked(
      const extensions::ExtensionId& extension_id) override;
  void OnDismissExtensionClicked(
      const extensions::ExtensionId& extension_id) override;
  void OnExtensionToggleSelected(const extensions::ExtensionId& extension_id,
                                 const url::Origin& origin,
                                 bool is_on) override;
  void OnReloadPageButtonClicked() override;
  void OnShowRequestsTogglePressed(const extensions::ExtensionId& extension_id,
                                   bool is_on) override;
  void OnSiteAccessSelected(
      const extensions::ExtensionId& extension_id,
      const url::Origin& origin,
      extensions::PermissionsManager::UserSiteAccess site_access) override;
  void OnSiteSettingsToggleButtonPressed(bool is_on) override;
  void OpenMainPage() override;
  void OpenSitePermissionsPage(
      const extensions::ExtensionId& extension_id) override;

 private:
  // Notifies the Java side that the menu is ready to be shown.
  void OnReady();

  const raw_ptr<BrowserWindowInterface> browser_;
  const raw_ptr<ExtensionsToolbarAndroid> toolbar_android_;

  // The platform-agnostic menu view model.
  std::unique_ptr<ExtensionsMenuViewModel> menu_model_;
  base::ScopedObservation<ExtensionsMenuViewModel,
                          ExtensionsMenuViewModel::Observer>
      menu_model_observation_{this};

  const base::android::ScopedJavaGlobalRef<jobject> java_object_;
};

}  // namespace extensions

#endif  // CHROME_BROWSER_UI_ANDROID_EXTENSIONS_EXTENSIONS_MENU_DELEGATE_ANDROID_H_
