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

#import <Foundation/Foundation.h>

#import "FlutterAppLifecycleDelegate.h"
#import "FlutterChannels.h"
#import "FlutterCodecs.h"
#import "FlutterMacros.h"

NS_ASSUME_NONNULL_BEGIN

@protocol FlutterPluginRegistrar;

/**
 * Implemented by the platform side of a Flutter plugin.
 *
 * Defines a set of optional callback methods and a method to set up the plugin
 * and register it to be called by other application components.
 *
 * Currently the macOS version of FlutterPlugin has very limited functionality, but is expected to
 * expand over time to more closely match the functionality of the iOS FlutterPlugin.
 */
FLUTTER_DARWIN_EXPORT
@protocol FlutterPlugin <NSObject, FlutterAppLifecycleDelegate>

/**
 * Creates an instance of the plugin to register with |registrar| using the desired
 * FlutterPluginRegistrar methods.
 */
+ (void)registerWithRegistrar:(id<FlutterPluginRegistrar>)registrar;

@optional

/**
 * Called when a message is sent from Flutter on a channel that a plugin instance has subscribed
 * to via -[FlutterPluginRegistrar addMethodCallDelegate:channel:].
 *
 * The |result| callback must be called exactly once, with one of:
 * - FlutterMethodNotImplemented, if the method call is unknown.
 * - A FlutterError, if the method call was understood but there was a
 *   problem handling it.
 * - Any other value (including nil) to indicate success. The value will
 *   be returned to the Flutter caller, and must be serializable to JSON.
 */
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result;

NS_ASSUME_NONNULL_END

@end
