// 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 'dart:js_interop';

import 'dom.dart';
import 'hr_time.dart';
import 'html.dart';
import 'service_workers.dart';
import 'vibration.dart';

typedef NotificationPermissionCallback = JSFunction;
typedef NotificationPermission = String;
typedef NotificationDirection = String;

@JS('Notification')
@staticInterop
class Notification implements EventTarget {
  external factory Notification(
    String title, [
    NotificationOptions options,
  ]);

  external static JSPromise requestPermission(
      [NotificationPermissionCallback deprecatedCallback]);
  external static NotificationPermission get permission;
  external static int get maxActions;
}

extension NotificationExtension on Notification {
  external JSVoid close();
  external set onclick(EventHandler value);
  external EventHandler get onclick;
  external set onshow(EventHandler value);
  external EventHandler get onshow;
  external set onerror(EventHandler value);
  external EventHandler get onerror;
  external set onclose(EventHandler value);
  external EventHandler get onclose;
  external String get title;
  external NotificationDirection get dir;
  external String get lang;
  external String get body;
  external String get tag;
  external String get image;
  external String get icon;
  external String get badge;
  external JSArray get vibrate;
  external EpochTimeStamp get timestamp;
  external bool get renotify;
  external bool? get silent;
  external bool get requireInteraction;
  external JSAny? get data;
  external JSArray get actions;
}

@JS()
@staticInterop
@anonymous
class NotificationOptions implements JSObject {
  external factory NotificationOptions({
    NotificationDirection dir,
    String lang,
    String body,
    String tag,
    String image,
    String icon,
    String badge,
    VibratePattern vibrate,
    EpochTimeStamp timestamp,
    bool renotify,
    bool? silent,
    bool requireInteraction,
    JSAny? data,
    JSArray actions,
  });
}

extension NotificationOptionsExtension on NotificationOptions {
  external set dir(NotificationDirection value);
  external NotificationDirection get dir;
  external set lang(String value);
  external String get lang;
  external set body(String value);
  external String get body;
  external set tag(String value);
  external String get tag;
  external set image(String value);
  external String get image;
  external set icon(String value);
  external String get icon;
  external set badge(String value);
  external String get badge;
  external set vibrate(VibratePattern value);
  external VibratePattern get vibrate;
  external set timestamp(EpochTimeStamp value);
  external EpochTimeStamp get timestamp;
  external set renotify(bool value);
  external bool get renotify;
  external set silent(bool? value);
  external bool? get silent;
  external set requireInteraction(bool value);
  external bool get requireInteraction;
  external set data(JSAny? value);
  external JSAny? get data;
  external set actions(JSArray value);
  external JSArray get actions;
}

@JS()
@staticInterop
@anonymous
class NotificationAction implements JSObject {
  external factory NotificationAction({
    required String action,
    required String title,
    String icon,
  });
}

extension NotificationActionExtension on NotificationAction {
  external set action(String value);
  external String get action;
  external set title(String value);
  external String get title;
  external set icon(String value);
  external String get icon;
}

@JS()
@staticInterop
@anonymous
class GetNotificationOptions implements JSObject {
  external factory GetNotificationOptions({String tag});
}

extension GetNotificationOptionsExtension on GetNotificationOptions {
  external set tag(String value);
  external String get tag;
}

@JS('NotificationEvent')
@staticInterop
class NotificationEvent implements ExtendableEvent {
  external factory NotificationEvent(
    String type,
    NotificationEventInit eventInitDict,
  );
}

extension NotificationEventExtension on NotificationEvent {
  external Notification get notification;
  external String get action;
}

@JS()
@staticInterop
@anonymous
class NotificationEventInit implements ExtendableEventInit {
  external factory NotificationEventInit({
    required Notification notification,
    String action,
  });
}

extension NotificationEventInitExtension on NotificationEventInit {
  external set notification(Notification value);
  external Notification get notification;
  external set action(String value);
  external String get action;
}
