// Copyright (c) 2023, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import '../../dom.dart';
import 'providers.dart';
import 'streams.dart';

extension ElementEventGetters on Element {
  ElementStream<Event> get onAbort =>
      EventStreamProviders.abortEvent.forElement(this);

  ElementStream<Event> get onBeforeCopy =>
      EventStreamProviders.beforeCopyEvent.forElement(this);

  ElementStream<Event> get onBeforeCut =>
      EventStreamProviders.beforeCutEvent.forElement(this);

  ElementStream<Event> get onBeforePaste =>
      EventStreamProviders.beforePasteEvent.forElement(this);

  ElementStream<Event> get onBlur =>
      EventStreamProviders.blurEvent.forElement(this);

  ElementStream<Event> get onCanPlay =>
      EventStreamProviders.canPlayEvent.forElement(this);

  ElementStream<Event> get onCanPlayThrough =>
      EventStreamProviders.canPlayThroughEvent.forElement(this);

  ElementStream<Event> get onChange =>
      EventStreamProviders.changeEvent.forElement(this);

  ElementStream<MouseEvent> get onClick =>
      EventStreamProviders.clickEvent.forElement(this);

  ElementStream<MouseEvent> get onContextMenu =>
      EventStreamProviders.contextMenuEvent.forElement(this);

  ElementStream<ClipboardEvent> get onCopy =>
      EventStreamProviders.copyEvent.forElement(this);

  ElementStream<ClipboardEvent> get onCut =>
      EventStreamProviders.cutEvent.forElement(this);

  ElementStream<Event> get onDoubleClick =>
      EventStreamProviders.doubleClickElementEvent.forElement(this);

  ElementStream<MouseEvent> get onDrag =>
      EventStreamProviders.dragEvent.forElement(this);

  ElementStream<MouseEvent> get onDragEnd =>
      EventStreamProviders.dragEndEvent.forElement(this);

  ElementStream<MouseEvent> get onDragEnter =>
      EventStreamProviders.dragEnterEvent.forElement(this);

  ElementStream<MouseEvent> get onDragLeave =>
      EventStreamProviders.dragLeaveEvent.forElement(this);

  ElementStream<MouseEvent> get onDragOver =>
      EventStreamProviders.dragOverEvent.forElement(this);

  ElementStream<MouseEvent> get onDragStart =>
      EventStreamProviders.dragStartEvent.forElement(this);

  ElementStream<MouseEvent> get onDrop =>
      EventStreamProviders.dropEvent.forElement(this);

  ElementStream<Event> get onDurationChange =>
      EventStreamProviders.durationChangeEvent.forElement(this);

  ElementStream<Event> get onEmptied =>
      EventStreamProviders.emptiedEvent.forElement(this);

  ElementStream<Event> get onEnded =>
      EventStreamProviders.endedEvent.forElement(this);

  ElementStream<Event> get onError =>
      EventStreamProviders.errorElementEvent.forElement(this);

  ElementStream<Event> get onFocus =>
      EventStreamProviders.focusEvent.forElement(this);

  ElementStream<Event> get onFullscreenChange =>
      EventStreamProviders.fullscreenChangeEvent.forElement(this);

  ElementStream<Event> get onFullscreenError =>
      EventStreamProviders.fullscreenErrorEvent.forElement(this);

  ElementStream<Event> get onInput =>
      EventStreamProviders.inputEvent.forElement(this);

  ElementStream<Event> get onInvalid =>
      EventStreamProviders.invalidEvent.forElement(this);

  ElementStream<KeyboardEvent> get onKeyDown =>
      EventStreamProviders.keyDownEvent.forElement(this);

  ElementStream<KeyboardEvent> get onKeyPress =>
      EventStreamProviders.keyPressEvent.forElement(this);

  ElementStream<KeyboardEvent> get onKeyUp =>
      EventStreamProviders.keyUpEvent.forElement(this);

  ElementStream<Event> get onLoad =>
      EventStreamProviders.loadEvent.forElement(this);

  ElementStream<Event> get onUnload =>
      EventStreamProviders.unloadEvent.forElement(this);

  ElementStream<Event> get onLoadedData =>
      EventStreamProviders.loadedDataEvent.forElement(this);

  ElementStream<Event> get onLoadedMetadata =>
      EventStreamProviders.loadedMetadataEvent.forElement(this);

  ElementStream<MouseEvent> get onMouseDown =>
      EventStreamProviders.mouseDownEvent.forElement(this);

  ElementStream<MouseEvent> get onMouseEnter =>
      EventStreamProviders.mouseEnterEvent.forElement(this);

  ElementStream<MouseEvent> get onMouseLeave =>
      EventStreamProviders.mouseLeaveEvent.forElement(this);

  ElementStream<MouseEvent> get onMouseMove =>
      EventStreamProviders.mouseMoveEvent.forElement(this);

  ElementStream<MouseEvent> get onMouseOut =>
      EventStreamProviders.mouseOutEvent.forElement(this);

  ElementStream<MouseEvent> get onMouseOver =>
      EventStreamProviders.mouseOverEvent.forElement(this);

  ElementStream<MouseEvent> get onMouseUp =>
      EventStreamProviders.mouseUpEvent.forElement(this);

  ElementStream<ClipboardEvent> get onPaste =>
      EventStreamProviders.pasteEvent.forElement(this);

  ElementStream<Event> get onPause =>
      EventStreamProviders.pauseEvent.forElement(this);

  ElementStream<Event> get onPlay =>
      EventStreamProviders.playEvent.forElement(this);

  ElementStream<Event> get onPlaying =>
      EventStreamProviders.playingEvent.forElement(this);

  ElementStream<Event> get onRateChange =>
      EventStreamProviders.rateChangeEvent.forElement(this);

  ElementStream<Event> get onReset =>
      EventStreamProviders.resetEvent.forElement(this);

  ElementStream<Event> get onResize =>
      EventStreamProviders.resizeEvent.forElement(this);

  ElementStream<Event> get onScroll =>
      EventStreamProviders.scrollEvent.forElement(this);

  ElementStream<Event> get onSearch =>
      EventStreamProviders.searchEvent.forElement(this);

  ElementStream<Event> get onSeeked =>
      EventStreamProviders.seekedEvent.forElement(this);

  ElementStream<Event> get onSeeking =>
      EventStreamProviders.seekingEvent.forElement(this);

  ElementStream<Event> get onSelect =>
      EventStreamProviders.selectEvent.forElement(this);

  ElementStream<Event> get onSelectStart =>
      EventStreamProviders.selectStartEvent.forElement(this);

  ElementStream<Event> get onStalled =>
      EventStreamProviders.stalledEvent.forElement(this);

  ElementStream<Event> get onSubmit =>
      EventStreamProviders.submitEvent.forElement(this);

  ElementStream<Event> get onSuspend =>
      EventStreamProviders.suspendEvent.forElement(this);

  ElementStream<Event> get onTimeUpdate =>
      EventStreamProviders.timeUpdateEvent.forElement(this);

  ElementStream<TouchEvent> get onTouchCancel =>
      EventStreamProviders.touchCancelEvent.forElement(this);

  ElementStream<TouchEvent> get onTouchEnd =>
      EventStreamProviders.touchEndEvent.forElement(this);

  ElementStream<TouchEvent> get onTouchEnter =>
      EventStreamProviders.touchEnterEvent.forElement(this);

  ElementStream<TouchEvent> get onTouchLeave =>
      EventStreamProviders.touchLeaveEvent.forElement(this);

  ElementStream<TouchEvent> get onTouchMove =>
      EventStreamProviders.touchMoveEvent.forElement(this);

  ElementStream<TouchEvent> get onTouchStart =>
      EventStreamProviders.touchStartEvent.forElement(this);

  ElementStream<Event> get onVolumeChange =>
      EventStreamProviders.volumeChangeEvent.forElement(this);

  ElementStream<Event> get onWaiting =>
      EventStreamProviders.waitingEvent.forElement(this);

  ElementStream<WebGLContextEvent> get onWebGlContextLost =>
      EventStreamProviders.webGlContextLostEvent.forElement(this);

  ElementStream<WebGLContextEvent> get onWebGlContextRestored =>
      EventStreamProviders.webGlContextRestoredEvent.forElement(this);

  ElementStream<WheelEvent> get onWheel =>
      EventStreamProviders.wheelEvent.forElement(this);
}

extension XHRGetters on XMLHttpRequest {
  Stream<ProgressEvent> get onLoad =>
      EventStreamProviders.loadEvent.forTarget(this);
  Stream<ProgressEvent> get onError =>
      EventStreamProviders.errorEvent.forTarget(this);
  Stream<ProgressEvent> get onProgress =>
      EventStreamProviders.progressEvent.forTarget(this);

  Stream<Event> get onReadyStateChange =>
      EventStreamProviders.readyStateChangeEvent.forTarget(this);
}

extension EventSourceEventGetters on EventSource {
  Stream<Event> get onError =>
      EventStreamProviders.errorEventSourceEvent.forTarget(this);

  Stream<MessageEvent> get onMessage =>
      EventStreamProviders.messageEvent.forTarget(this);

  Stream<Event> get onOpen => EventStreamProviders.openEvent.forTarget(this);
}

extension FileReaderEventGetters on FileReader {
  Stream<ProgressEvent> get onAbort =>
      EventStreamProviders.abortEvent.forTarget(this);
  Stream<ProgressEvent> get onError =>
      EventStreamProviders.errorEvent.forTarget(this);
  Stream<ProgressEvent> get onLoad =>
      EventStreamProviders.loadEvent.forTarget(this);
  Stream<ProgressEvent> get onLoadEnd =>
      EventStreamProviders.loadEndEvent.forTarget(this);
  Stream<ProgressEvent> get onLoadStart =>
      EventStreamProviders.loadStartEvent.forTarget(this);
  Stream<ProgressEvent> get onProgress =>
      EventStreamProviders.progressEvent.forTarget(this);
}

extension AutoElementEventGetters on AudioNode {
  Stream<Event> get onEnded => EventStreamProviders.endedEvent.forTarget(this);
}

extension WindowEventGetters on Window {
  Stream<KeyboardEvent> get onKeyDown =>
      EventStreamProviders.keyDownEvent.forTarget(this);

  Stream<KeyboardEvent> get onKeyPress =>
      EventStreamProviders.keyPressEvent.forTarget(this);

  Stream<Event> get onLoad => EventStreamProviders.loadEvent.forTarget(this);

  Stream<MessageEvent> get onMessage =>
      EventStreamProviders.messageEvent.forTarget(this);

  Stream<PopStateEvent> get onPopState =>
      EventStreamProviders.popStateEvent.forTarget(this);

  Stream<TouchEvent> get onTouchMove =>
      EventStreamProviders.touchMoveEvent.forTarget(this);
}

extension ElementCustomEvents on Element {
  ElementStream<WheelEvent> get onMouseWheel =>
      CustomEventProviders.mouseWheelEvent.forElement(this);

  ElementStream<TransitionEvent> get onTransitionEnd =>
      CustomEventProviders.transitionEndEvent.forElement(this);
}

extension DocumentCustomEvents on Document {
  Stream<Event> get onLoad => EventStreamProviders.loadEvent.forTarget(this);

  Stream<WheelEvent> get onMouseWheel =>
      CustomEventProviders.mouseWheelEvent.forTarget(this);

  Stream<Event> get onVisibilityChange =>
      CustomEventProviders.visibilityChangeEvent.forTarget(this);
}

extension WindowCustomEvents on Window {
  Stream<WheelEvent> get onMouseWheel =>
      CustomEventProviders.mouseWheelEvent.forTarget(this);

  Stream<TransitionEvent> get onTransitionEnd =>
      CustomEventProviders.transitionEndEvent.forTarget(this);
}

extension WebSocketEvents on WebSocket {
  Stream<Event> get onOpen => EventStreamProviders.openEvent.forTarget(this);
  Stream<MessageEvent> get onMessage =>
      EventStreamProviders.messageEvent.forTarget(this);
  Stream<CloseEvent> get onClose =>
      EventStreamProviders.closeEvent.forTarget(this);
  Stream<Event> get onError =>
      EventStreamProviders.errorEventSourceEvent.forTarget(this);
}
