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

// This code is copied from `package:web` which still needs its own
// documentation for public members. Since this is a shim that users should not
// use, we ignore this lint for this file.
// ignore_for_file: public_member_api_docs

/// A stripped down version of `package:web` to avoid pinning that repo in
/// Flutter as a dependency.
///
/// These are manually copied over from `package:web` as needed, and should stay
/// in sync with the latest package version as much as possible.
///
/// If missing members are needed, copy them over into the corresponding
/// extension or interface. If missing interfaces/types are needed, copy them
/// over while excluding unnecessary inheritance to make the copy minimal. These
/// types are erased at runtime, so excluding supertypes is safe. If a member is
/// needed that belongs to a supertype, then add the necessary `implements`
/// clause to the subtype when you add that supertype. Keep extensions next to
/// the interface they extend.
library;

import 'dart:js_interop';

typedef EventListener = JSFunction;
typedef XMLHttpRequestResponseType = String;

@JS()
external Document get document;

@JS()
external Window get window;

extension type CSSStyleDeclaration._(JSObject _) implements JSObject {
  external set backgroundColor(String value);
  external String get backgroundColor;
  external set border(String value);
  external String get border;
  external set height(String value);
  external String get height;
  external set width(String value);
  external String get width;
}

extension type CSSStyleSheet._(JSObject _) implements JSObject {
  external int insertRule(
    String rule, [
    int index,
  ]);
}

extension type Document._(JSObject _) implements JSObject {
  external Element createElement(
    String localName, [
    JSAny options,
  ]);
  external Range createRange();
  external HTMLHeadElement? get head;
}

extension type DOMTokenList._(JSObject _) implements JSObject {
  external void add(String tokens);
}

extension type Element._(JSObject _) implements Node, JSObject {
  external DOMTokenList get classList;
  external void append(JSAny nodes);
}

extension type Event._(JSObject _) implements JSObject {}

extension type EventTarget._(JSObject _) implements JSObject {
  external void addEventListener(
    String type,
    EventListener? callback, [
    JSAny options,
  ]);
}

extension type HTMLElement._(JSObject _) implements Element, JSObject {
  external String get innerText;
  external set innerText(String value);
  external CSSStyleDeclaration get style;
}

extension type HTMLHeadElement._(JSObject _) implements HTMLElement, JSObject {}

extension type HTMLStyleElement._(JSObject _) implements HTMLElement, JSObject {
  external CSSStyleSheet? get sheet;
}

extension type MediaQueryList._(JSObject _) implements EventTarget, JSObject {
  external bool get matches;
}

extension type MouseEvent._(JSObject _) implements JSObject {
  external num get offsetX;
  external num get offsetY;
  external int get button;
}

extension type Navigator._(JSObject _) implements JSObject {
  external String get platform;
}

extension type Node._(JSObject _) implements EventTarget, JSObject {}

extension type Range._(JSObject _) implements JSObject {
  external void selectNode(Node node);
}

extension type Selection._(JSObject _) implements JSObject {
  external void addRange(Range range);
  external void removeAllRanges();
}

extension type Window._(JSObject _) implements EventTarget, JSObject {
  external Navigator get navigator;
  external MediaQueryList matchMedia(String query);
  external Selection? getSelection();
}

extension type XMLHttpRequest._(JSObject _)
    implements XMLHttpRequestEventTarget, JSObject {
  external factory XMLHttpRequest();
  external void open(
    String method,
    String url, [
    bool async,
    String? username,
    String? password,
  ]);
  external void setRequestHeader(
    String name,
    String value,
  );
  external void send([JSAny? body]);
  external int get status;
  external set responseType(XMLHttpRequestResponseType value);
  external XMLHttpRequestResponseType get responseType;
  external JSAny? get response;
}

extension type XMLHttpRequestEventTarget._(JSObject _)
    implements EventTarget, JSObject {}
