// 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 'package:pigeon/pigeon.dart';

@ConfigurePigeon(
  PigeonOptions(
    dartOut: 'lib/src/common/web_kit.pigeon.dart',
    dartTestOut: 'test/src/common/test_web_kit.pigeon.dart',
    dartOptions: DartOptions(isNullSafe: true, copyrightHeader: <String>[
      '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.',
    ]),
  ),
)

/// Mirror of NSKeyValueObservingOptions.
///
/// See https://developer.apple.com/documentation/foundation/nskeyvalueobservingoptions?language=objc.
enum NSKeyValueObservingOptionsEnum {
  newValue,
  oldValue,
  initialValue,
  priorNotification,
}

class NSKeyValueObservingOptionsEnumData {
  // TODO(bparrishMines): Generated code fails when enums are marked as nonnull.
  // Change to nonnull once this is fixed: https://github.com/flutter/flutter/issues/100594
  late NSKeyValueObservingOptionsEnum? value;
}

/// Mirror of NSKeyValueChange.
///
/// See https://developer.apple.com/documentation/foundation/nskeyvaluechange?language=objc.
enum NSKeyValueChangeEnum {
  setting,
  insertion,
  removal,
  replacement,
}

class NSKeyValueChangeEnumData {
  late NSKeyValueChangeEnum? value;
}

/// Mirror of NSKeyValueChangeKey.
///
/// See https://developer.apple.com/documentation/foundation/nskeyvaluechangekey?language=objc.
enum NSKeyValueChangeKeyEnum {
  indexes,
  kind,
  newValue,
  notificationIsPrior,
  oldValue,
}

class NSKeyValueChangeKeyEnumData {
  late NSKeyValueChangeKeyEnum? value;
}

/// Mirror of WKUserScriptInjectionTime.
///
/// See https://developer.apple.com/documentation/webkit/wkuserscriptinjectiontime?language=objc.
enum WKUserScriptInjectionTimeEnum {
  atDocumentStart,
  atDocumentEnd,
}

class WKUserScriptInjectionTimeEnumData {
  late WKUserScriptInjectionTimeEnum? value;
}

/// Mirror of WKAudiovisualMediaTypes.
///
/// See [WKAudiovisualMediaTypes](https://developer.apple.com/documentation/webkit/wkaudiovisualmediatypes?language=objc).
enum WKAudiovisualMediaTypeEnum {
  none,
  audio,
  video,
  all,
}

class WKAudiovisualMediaTypeEnumData {
  late WKAudiovisualMediaTypeEnum? value;
}

/// Mirror of WKWebsiteDataTypes.
///
/// See https://developer.apple.com/documentation/webkit/wkwebsitedatarecord/data_store_record_types?language=objc.
enum WKWebsiteDataTypesEnum {
  cookies,
  memoryCache,
  diskCache,
  offlineWebApplicationCache,
  localStroage,
  sessionStorage,
  sqlDatabases,
  indexedDBDatabases,
}

class WKWebsiteDataTypesEnumData {
  late WKWebsiteDataTypesEnum? value;
}

/// Mirror of WKNavigationActionPolicy.
///
/// See https://developer.apple.com/documentation/webkit/wknavigationactionpolicy?language=objc.
enum WKNavigationActionPolicyEnum {
  allow,
  cancel,
}

class WKNavigationActionPolicyEnumData {
  late WKNavigationActionPolicyEnum? value;
}

/// Mirror of NSHTTPCookiePropertyKey.
///
/// See https://developer.apple.com/documentation/foundation/nshttpcookiepropertykey.
enum NSHttpCookiePropertyKeyEnum {
  comment,
  commentUrl,
  discard,
  domain,
  expires,
  maximumAge,
  name,
  originUrl,
  path,
  port,
  sameSitePolicy,
  secure,
  value,
  version,
}

class NSHttpCookiePropertyKeyEnumData {
  late NSHttpCookiePropertyKeyEnum? value;
}

/// Mirror of NSURLRequest.
///
/// See https://developer.apple.com/documentation/foundation/nsurlrequest?language=objc.
class NSUrlRequestData {
  late String url;
  late String? httpMethod;
  late Uint8List? httpBody;
  late Map<String?, String?> allHttpHeaderFields;
}

/// Mirror of WKUserScript.
///
/// See https://developer.apple.com/documentation/webkit/wkuserscript?language=objc.
class WKUserScriptData {
  late String source;
  late WKUserScriptInjectionTimeEnumData? injectionTime;
  late bool isMainFrameOnly;
}

/// Mirror of WKNavigationAction.
///
/// See https://developer.apple.com/documentation/webkit/wknavigationaction.
class WKNavigationActionData {
  late NSUrlRequestData request;
  late WKFrameInfoData targetFrame;
}

/// Mirror of WKFrameInfo.
///
/// See https://developer.apple.com/documentation/webkit/wkframeinfo?language=objc.
class WKFrameInfoData {
  late bool isMainFrame;
}

/// Mirror of NSError.
///
/// See https://developer.apple.com/documentation/foundation/nserror?language=objc.
class NSErrorData {
  late int code;
  late String domain;
  late String localiziedDescription;
}

/// Mirror of WKScriptMessage.
///
/// See https://developer.apple.com/documentation/webkit/wkscriptmessage?language=objc.
class WKScriptMessageData {
  late String name;
  late Object? body;
}

/// Mirror of NSHttpCookieData.
///
/// See https://developer.apple.com/documentation/foundation/nshttpcookie?language=objc.
class NSHttpCookieData {
  late Map<NSHttpCookiePropertyKeyEnumData?, String?> properties;
}

/// Mirror of WKWebsiteDataStore.
///
/// See https://developer.apple.com/documentation/webkit/wkwebsitedatastore?language=objc.
@HostApi(dartHostTestHandler: 'TestWKWebsiteDataStoreHostApi')
abstract class WKWebsiteDataStoreHostApi {
  void createFromWebViewConfiguration(
    int instanceId,
    int configurationInstanceId,
  );

  void createDefaultDataStore(int instanceId);

  @async
  bool removeDataOfTypes(
    int instanceId,
    List<WKWebsiteDataTypesEnumData> dataTypes,
    double secondsModifiedSinceEpoch,
  );
}

/// Mirror of UIView.
///
/// See https://developer.apple.com/documentation/uikit/uiview?language=objc.
@HostApi(dartHostTestHandler: 'TestUIViewHostApi')
abstract class UIViewHostApi {
  List<double?> getContentOffset(int instanceId);

  void setBackgroundColor(int instanceId, int? value);

  void setOpaque(int instanceId, bool opaque);
}

/// Mirror of UIScrollView.
///
/// See https://developer.apple.com/documentation/uikit/uiscrollview?language=objc.
@HostApi(dartHostTestHandler: 'TestUIScrollViewHostApi')
abstract class UIScrollViewHostApi {
  void createFromWebView(int instanceId, int webViewInstanceId);

  List<double?> getContentOffset(int instanceId);

  void scrollBy(int instanceId, double x, double y);

  void setContentOffset(int instanceId, double x, double y);
}

/// Mirror of WKWebViewConfiguration.
///
/// See https://developer.apple.com/documentation/webkit/wkwebviewconfiguration?language=objc.
@HostApi(dartHostTestHandler: 'TestWKWebViewConfigurationHostApi')
abstract class WKWebViewConfigurationHostApi {
  void create(int instanceId);

  void createFromWebView(int instanceId, int webViewInstanceId);

  void setAllowsInlineMediaPlayback(int instanceId, bool allow);

  void setMediaTypesRequiringUserActionForPlayback(
    int instanceId,
    List<WKAudiovisualMediaTypeEnumData> types,
  );
}

/// Mirror of WKUserContentController.
///
/// See https://developer.apple.com/documentation/webkit/wkusercontentcontroller?language=objc.
@HostApi(dartHostTestHandler: 'TestWKUserContentControllerHostApi')
abstract class WKUserContentControllerHostApi {
  void createFromWebViewConfiguration(
    int instanceId,
    int configurationInstanceId,
  );

  void addScriptMessageHandler(
    int instanceId,
    int handlerInstanceid,
    String name,
  );

  void removeScriptMessageHandler(int instanceId, String name);

  void removeAllScriptMessageHandlers(int instanceId);

  void addUserScript(int instanceId, WKUserScriptData userScript);

  void removeAllUserScripts(int instanceId);
}

/// Mirror of WKUserPreferences.
///
/// See https://developer.apple.com/documentation/webkit/wkpreferences?language=objc.
@HostApi(dartHostTestHandler: 'TestWKPreferencesHostApi')
abstract class WKPreferencesHostApi {
  void createFromWebViewConfiguration(
    int instanceId,
    int configurationInstanceId,
  );

  void setJavaScriptEnabled(int instanceId, bool enabled);
}

/// Mirror of WKScriptMessageHandler.
///
/// See https://developer.apple.com/documentation/webkit/wkscriptmessagehandler?language=objc.
@HostApi(dartHostTestHandler: 'TestWKScriptMessageHandlerHostApi')
abstract class WKScriptMessageHandlerHostApi {
  void create(int instanceId);
}

/// Mirror of WKNavigationDelegate.
///
/// See https://developer.apple.com/documentation/webkit/wknavigationdelegate?language=objc.
@HostApi(dartHostTestHandler: 'TestWKNavigationDelegateHostApi')
abstract class WKNavigationDelegateHostApi {
  void create(int instanceId);

  void setDidFinishNavigation(int instanceId, int? functionInstanceId);
}

/// Mirror of WKNavigationDelegate.
///
/// See https://developer.apple.com/documentation/webkit/wknavigationdelegate?language=objc.
@FlutterApi()
abstract class WKNavigationDelegateFlutterApi {
  void didFinishNavigation(
    int functionInstanceId,
    int webViewInstanceId,
    String? url,
  );
}

/// Mirror of NSObject.
///
/// See https://developer.apple.com/documentation/objectivec/nsobject.
@HostApi(dartHostTestHandler: 'TestNSObjectHostApi')
abstract class NSObjectHostApi {
  void dispose(int instanceId);

  void addObserver(
    int instanceId,
    int observerInstanceId,
    String keyPath,
    List<NSKeyValueObservingOptionsEnumData> options,
  );

  void removeObserver(int instanceId, int observerInstanceId, String keyPath);
}

/// Disposes references to functions.
@FlutterApi()
abstract class FunctionFlutterApi {
  void dispose(int instanceId);
}

/// Mirror of WKWebView.
///
/// See https://developer.apple.com/documentation/webkit/wkwebview?language=objc.
@HostApi(dartHostTestHandler: 'TestWKWebViewHostApi')
abstract class WKWebViewHostApi {
  void create(int instanceId, int configurationInstanceId);

  void setUIDelegate(int instanceId, int? uiDelegateInstanceId);

  void setNavigationDelegate(int instanceId, int? navigationDelegateInstanceId);

  String? getUrl(int instanceId);

  double getEstimatedProgress(int instanceId);

  void loadRequest(int instanceId, NSUrlRequestData request);

  void loadHtmlString(int instanceId, String string, String? baseUrl);

  void loadFileUrl(int instanceId, String url, String readAccessUrl);

  void loadFlutterAsset(int instanceId, String key);

  bool canGoBack(int instanceId);

  bool canGoForward(int instanceId);

  void goBack(int instanceId);

  void goForward(int instanceId);

  void reload(int instanceId);

  String? getTitle(int instanceId);

  void setAllowsBackForwardNavigationGestures(int instanceId, bool allow);

  void setCustomUserAgent(int instanceId, String? userAgent);

  @async
  String evaluateJavaScript(int instanceId, String javascriptString);
}

/// Mirror of WKUIDelegate.
///
/// See https://developer.apple.com/documentation/webkit/wkuidelegate?language=objc.
@HostApi(dartHostTestHandler: 'TestWKUIDelegateHostApi')
abstract class WKUIDelegateHostApi {
  void create(int instanceId);
}

/// Mirror of WKHttpCookieStore.
///
/// See https://developer.apple.com/documentation/webkit/wkhttpcookiestore?language=objc.
@HostApi(dartHostTestHandler: 'TestWKHttpCookieStoreHostApi')
abstract class WKHttpCookieStoreHostApi {
  void createFromWebsiteDataStore(
    int instanceId,
    int websiteDataStoreInstanceId,
  );

  void setCookie(int instanceId, NSHttpCookieData cookie);
}
