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

/*
// DOM shim. This file contains everything we need from the DOM API written as
// @staticInterop, so we don't need dart:html
// https://developer.mozilla.org/en-US/docs/Web/API/
*/

import 'package:js/js.dart';

/// Document interface
@JS()
@staticInterop
@anonymous
abstract class DomHtmlDocument {}

/// Some methods of document
extension DomHtmlDocumentExtension on DomHtmlDocument {
  /// document.head
  external DomHtmlElement get head;

  /// document.createElement
  external DomHtmlElement createElement(String tagName);
}

/// console interface
@JS()
@staticInterop
@anonymous
abstract class DomConsole {}

/// The interface of window.console
extension DomConsoleExtension on DomConsole {
  /// console.debug
  external DomConsoleDumpFn get debug;

  /// console.info
  external DomConsoleDumpFn get info;

  /// console.log
  external DomConsoleDumpFn get log;

  /// console.warn
  external DomConsoleDumpFn get warn;

  /// console.error
  external DomConsoleDumpFn get error;
}

/// Fakey variadic-type for console-dumping methods (like console.log or info).
typedef DomConsoleDumpFn = void Function(
  Object? arg, [
  Object? arg2,
  Object? arg3,
  Object? arg4,
  Object? arg5,
  Object? arg6,
  Object? arg7,
  Object? arg8,
  Object? arg9,
  Object? arg10,
]);

/// An instance of an HTMLElement
@JS()
@staticInterop
@anonymous
abstract class DomHtmlElement {}

/// (Some) methods of HtmlElement
extension DomHtmlElementExtension on DomHtmlElement {
  /// Node.appendChild
  external DomHtmlElement appendChild(DomHtmlElement child);
}

/// An instance of an HTMLScriptElement
@JS()
@staticInterop
@anonymous
abstract class DomHtmlScriptElement extends DomHtmlElement {}

/// Some methods exclusive of Script elements
extension DomHtmlScriptElementExtension on DomHtmlScriptElement {
  external set src(Object stringOrSafeScriptURL);
  external set async(bool async);
  external set defer(bool defer);
}

/// Error object
@JS('Error')
@staticInterop
abstract class DomError {}

/// Methods on the error object
extension DomErrorExtension on DomError {
  /// Error message.
  external String? get message;

  /// Stack trace.
  external String? get stack;

  /// Error name. This is determined by the constructor function.
  external String get name;

  /// Error cause indicating the reason why the current error is thrown.
  ///
  /// This is usually another caught error, or the value provided as the `cause`
  /// property of the Error constructor's second argument.
  external Object? get cause;
}

/*
// Trusted Types API (TrustedTypePolicy, TrustedScript, TrustedScriptURL)
// https://developer.mozilla.org/en-US/docs/Web/API/TrustedTypesAPI
*/

/// A factory to create `TrustedTypePolicy` objects.
@JS()
@staticInterop
@anonymous
abstract class DomTrustedTypePolicyFactory {}

/// (Some) methods of the [DomTrustedTypePolicyFactory]:
extension DomTrustedTypePolicyFactoryExtension on DomTrustedTypePolicyFactory {
  /// createPolicy
  external DomTrustedTypePolicy createPolicy(
    String policyName,
    DomTrustedTypePolicyOptions? policyOptions,
  );
}

/// Options to create a trusted type policy.
@JS()
@staticInterop
@anonymous
abstract class DomTrustedTypePolicyOptions {
  /// Constructs a TrustedPolicyOptions object in JavaScript.
  ///
  /// The following properties need to be manually wrapped in [allowInterop]
  /// before being passed to this constructor: [createScriptURL].
  external factory DomTrustedTypePolicyOptions({
    DomCreateScriptUrlOptionFn? createScriptURL,
  });
}

/// Type of the function to configure createScriptURL
typedef DomCreateScriptUrlOptionFn = String Function(String input);

/// An instance of a TrustedTypePolicy
@JS()
@staticInterop
@anonymous
abstract class DomTrustedTypePolicy {}

/// (Some) methods of the [DomTrustedTypePolicy]
extension DomTrustedTypePolicyExtension on DomTrustedTypePolicy {
  /// Create a `TrustedScriptURL` for the given [input].
  external DomTrustedScriptUrl createScriptURL(String input);
}

/// An instance of a DomTrustedScriptUrl
@JS()
@staticInterop
@anonymous
abstract class DomTrustedScriptUrl {}

// Getters

/// window.document
@JS()
@staticInterop
@anonymous
external DomHtmlDocument get document;

/// window.trustedTypes (may or may not be supported by the browser)
@JS()
@staticInterop
@anonymous
external DomTrustedTypePolicyFactory? get trustedTypes;

/// window.console
@JS()
@staticInterop
@anonymous
external DomConsole get console;
