// 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:flutter/foundation.dart';

/// The desired mode to launch a URL.
///
/// Support for these modes varies by platform. Platforms that do not support
/// the requested mode may substitute another mode. See [launchUrl] for more
/// details.
enum LaunchMode {
  /// Leaves the decision of how to launch the URL to the platform
  /// implementation.
  platformDefault,

  /// Loads the URL in an in-app web view (e.g., Android WebView).
  inAppWebView,

  /// Loads the URL in an in-app web view (e.g., Android Custom Tabs, SFSafariViewController).
  inAppBrowserView,

  /// Passes the URL to the OS to be handled by another application.
  externalApplication,

  /// Passes the URL to the OS to be handled by another non-browser application.
  externalNonBrowserApplication,
}

/// Additional configuration options for [LaunchMode.inAppWebView].
@immutable
class WebViewConfiguration {
  /// Creates a new WebViewConfiguration with the given settings.
  const WebViewConfiguration({
    this.enableJavaScript = true,
    this.enableDomStorage = true,
    this.headers = const <String, String>{},
  });

  /// Whether or not JavaScript is enabled for the web content.
  ///
  /// Disabling this may not be supported on all platforms.
  final bool enableJavaScript;

  /// Whether or not DOM storage is enabled for the web content.
  ///
  /// Disabling this may not be supported on all platforms.
  final bool enableDomStorage;

  /// Additional headers to pass in the load request.
  ///
  /// On Android, this may work even when not loading in an in-app web view.
  /// When loading in an external browsers, this sets
  /// [Browser.EXTRA_HEADERS](https://developer.android.com/reference/android/provider/Browser#EXTRA_HEADERS)
  /// Not all browsers support this, so it is not guaranteed to be honored.
  final Map<String, String> headers;
}

/// Additional configuration options for [LaunchMode.inAppBrowserView]
@immutable
class BrowserConfiguration {
  /// Creates a new InAppBrowserConfiguration with given settings.
  const BrowserConfiguration({this.showTitle = false});

  /// Whether or not to show the webpage title.
  ///
  /// May not be supported on all platforms.
  final bool showTitle;
}
