// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_SHELL_PLATFORM_DARWIN_MACOS_FRAMEWORK_SOURCE_ACCESSIBILITY_BRIDGE_MAC_H_
#define FLUTTER_SHELL_PLATFORM_DARWIN_MACOS_FRAMEWORK_SOURCE_ACCESSIBILITY_BRIDGE_MAC_H_

#import <Cocoa/Cocoa.h>

#include "flutter/shell/platform/common/accessibility_bridge.h"

@class FlutterEngine;
@class FlutterViewController;

namespace flutter {

//------------------------------------------------------------------------------
/// The macOS implementation of AccessibilityBridge.
///
/// This interacts with macOS accessibility APIs, which includes routing
/// accessibility events fired from the framework to macOS, routing native
/// macOS accessibility events to the framework, and creating macOS-specific
/// FlutterPlatformNodeDelegate objects for each node in the semantics tree.
///
/// AccessibilityBridgeMac must be created as a shared_ptr, since some methods
/// acquires its weak_ptr.
class AccessibilityBridgeMac : public AccessibilityBridge {
 public:
  //---------------------------------------------------------------------------
  /// @brief      Creates an AccessibilityBridgeMacDelegate.
  /// @param[in]  flutter_engine     The weak reference to the FlutterEngine.
  /// @param[in]  view_controller    The weak reference to the FlutterViewController.
  explicit AccessibilityBridgeMac(__weak FlutterEngine* flutter_engine,
                                  __weak FlutterViewController* view_controller);
  virtual ~AccessibilityBridgeMac() = default;

  // |FlutterPlatformNodeDelegate::OwnerBridge|
  void DispatchAccessibilityAction(AccessibilityNodeId target,
                                   FlutterSemanticsAction action,
                                   fml::MallocMapping data) override;

  // Update the default view controller, and recreate the corresponding
  // accessibility node delegate.
  //
  // This is called by the engine when the default view controller is updated.
  void UpdateDefaultViewController(__weak FlutterViewController* view_controller);

 protected:
  // |AccessibilityBridge|
  void OnAccessibilityEvent(ui::AXEventGenerator::TargetedEvent targeted_event) override;

  // |AccessibilityBridge|
  std::shared_ptr<FlutterPlatformNodeDelegate> CreateFlutterPlatformNodeDelegate() override;

 private:
  /// A wrapper structure to wraps macOS native accessibility events.
  struct NSAccessibilityEvent {
    NSAccessibilityNotificationName name;
    gfx::NativeViewAccessible target;
    NSDictionary* user_info;
  };

  //---------------------------------------------------------------------------
  /// @brief      Posts the given event against the given node to the macOS
  ///             accessibility notification system.
  /// @param[in]  native_node       The event target, must not be nil.
  /// @param[in]  mac_notification  The event name, must not be nil.
  virtual void DispatchMacOSNotification(gfx::NativeViewAccessible native_node,
                                         NSAccessibilityNotificationName mac_notification);

  //---------------------------------------------------------------------------
  /// @brief      Posts the given event against the given node with the
  ///             additional attributes to the macOS accessibility notification
  ///             system.
  /// @param[in]  native_node       The event target, must not be nil.
  /// @param[in]  mac_notification  The event name, must not be nil.
  /// @param[in]  user_info         The additional attributes, must not be nil.
  void DispatchMacOSNotificationWithUserInfo(gfx::NativeViewAccessible native_node,
                                             NSAccessibilityNotificationName mac_notification,
                                             NSDictionary* user_info);

  //---------------------------------------------------------------------------
  /// @brief      Whether the given event is in current pending events.
  /// @param[in]  event_type        The event to look up.
  bool HasPendingEvent(ui::AXEventGenerator::Event event) const;

  //---------------------------------------------------------------------------
  /// @brief      Converts the give ui::AXEventGenerator::Event into
  ///             macOS native accessibility event[s]
  /// @param[in]  event_type        The original event type.
  /// @param[in]  ax_node           The original event target.
  std::vector<NSAccessibilityEvent> MacOSEventsFromAXEvent(ui::AXEventGenerator::Event event_type,
                                                           const ui::AXNode& ax_node) const;

  __weak FlutterEngine* flutter_engine_;
  __weak FlutterViewController* view_controller_;
};

}  // namespace flutter

#endif  // FLUTTER_SHELL_PLATFORM_DARWIN_MACOS_FRAMEWORK_SOURCE_ACCESSIBILITY_BRIDGE_MAC_H_
