// Copyright (c) 2025, 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.
//
// API docs from [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web).
// Attributions and copyright licensing by Mozilla Contributors is licensed
// under [CC-BY-SA 2.5](https://creativecommons.org/licenses/by-sa/2.5/.

// Generated from Web IDL definitions.

// ignore_for_file: unintended_html_in_doc_comment

@JS()
library;

import 'dart:js_interop';

import 'dom.dart';
import 'html.dart';
import 'mediacapture_streams.dart';

typedef SpeechRecognitionErrorCode = String;
typedef SpeechSynthesisErrorCode = String;

/// The **`SpeechRecognition`** interface of the
/// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
/// is the controller interface for the recognition service; this also handles
/// the [SpeechRecognitionEvent] sent from the recognition service.
///
/// > [!NOTE]
/// > On some browsers, like Chrome, using Speech Recognition on a web page
/// > involves a server-based recognition engine. Your audio is sent to a web
/// > service for recognition processing, so it won't work offline.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition).
extension type SpeechRecognition._(JSObject _)
    implements EventTarget, JSObject {
  external factory SpeechRecognition();

  /// The **`start()`** method of the
  /// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
  /// starts the speech
  /// recognition service listening to incoming audio with intent to recognize
  /// grammars
  /// associated with the current [SpeechRecognition].
  external void start([MediaStreamTrack audioTrack]);

  /// The **`stop()`** method of the
  /// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
  /// stops the speech
  /// recognition service from listening to incoming audio, and attempts to
  /// return a
  /// [SpeechRecognitionResult] using the audio captured so far.
  external void stop();

  /// The **`abort()`** method of the
  /// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
  /// stops the speech
  /// recognition service from listening to incoming audio, and doesn't attempt
  /// to return a
  /// [SpeechRecognitionResult].
  external void abort();

  /// The **`lang`** property of the [SpeechRecognition]
  /// interface returns and sets the language of the current
  /// `SpeechRecognition`.
  /// If not specified, this defaults to the HTML
  /// [`lang`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)
  /// attribute
  /// value, or the user agent's language setting if that isn't set either.
  external String get lang;
  external set lang(String value);

  /// The **`continuous`** property of the
  /// [SpeechRecognition] interface controls whether continuous results are
  /// returned for each recognition, or only a single result.
  ///
  /// It defaults to single results (`false`.)
  external bool get continuous;
  external set continuous(bool value);

  /// The **`interimResults`** property of the
  /// [SpeechRecognition] interface controls whether interim results should be
  /// returned (`true`) or not (`false`). Interim results are results
  /// that are not yet final (e.g. the [SpeechRecognitionResult.isFinal]
  /// property
  /// is `false`).
  ///
  /// The default value for **`interimResults`** is `false`.
  external bool get interimResults;
  external set interimResults(bool value);

  /// The **`maxAlternatives`** property of the
  /// [SpeechRecognition] interface sets the maximum number of
  /// [SpeechRecognitionAlternative]s provided per
  /// [SpeechRecognitionResult].
  ///
  /// The default value is 1.
  external int get maxAlternatives;
  external set maxAlternatives(int value);
  external EventHandler get onaudiostart;
  external set onaudiostart(EventHandler value);
  external EventHandler get onsoundstart;
  external set onsoundstart(EventHandler value);
  external EventHandler get onspeechstart;
  external set onspeechstart(EventHandler value);
  external EventHandler get onspeechend;
  external set onspeechend(EventHandler value);
  external EventHandler get onsoundend;
  external set onsoundend(EventHandler value);
  external EventHandler get onaudioend;
  external set onaudioend(EventHandler value);
  external EventHandler get onresult;
  external set onresult(EventHandler value);
  external EventHandler get onnomatch;
  external set onnomatch(EventHandler value);
  external EventHandler get onerror;
  external set onerror(EventHandler value);
  external EventHandler get onstart;
  external set onstart(EventHandler value);
  external EventHandler get onend;
  external set onend(EventHandler value);
}

/// The **`SpeechRecognitionErrorEvent`** interface of the
/// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
/// represents error messages from the recognition service.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognitionErrorEvent).
extension type SpeechRecognitionErrorEvent._(JSObject _)
    implements Event, JSObject {
  /// The **`error`** read-only property of the
  /// [SpeechRecognitionErrorEvent] interface returns the type of error raised.
  external SpeechRecognitionErrorCode get error;

  /// The **`message`** read-only property of the
  /// [SpeechRecognitionErrorEvent] interface returns a message describing the
  /// error in more detail.
  external String get message;
}

/// The **`SpeechRecognitionAlternative`** interface of the
/// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
/// represents a single word that has been recognized by the speech recognition
/// service.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognitionAlternative).
extension type SpeechRecognitionAlternative._(JSObject _) implements JSObject {
  /// The **`transcript`** read-only property of the
  /// [SpeechRecognitionResult] interface returns a string containing the
  /// transcript of the recognized word(s).
  ///
  /// For continuous recognition, leading or trailing whitespace will be
  /// included where
  /// necessary so that concatenation of consecutive [SpeechRecognitionResult]s
  /// produces a proper transcript of the session.
  external String get transcript;

  /// The **`confidence`** read-only property of the
  /// [SpeechRecognitionResult] interface returns a numeric estimate of how
  /// confident the speech recognition system is that the recognition is
  /// correct.
  ///
  /// > [!NOTE]
  /// > Mozilla's implementation of `confidence` is still
  /// > being worked on — at the moment, it always seems to return 1.
  external double get confidence;
}

/// The **`SpeechRecognitionResult`** interface of the
/// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
/// represents a single recognition match, which may contain multiple
/// [SpeechRecognitionAlternative] objects.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognitionResult).
extension type SpeechRecognitionResult._(JSObject _) implements JSObject {
  /// The **`item`** getter of the
  /// [SpeechRecognitionResult] interface is a standard getter that allows
  /// [SpeechRecognitionAlternative] objects within the result to be accessed
  /// via
  /// array syntax.
  external SpeechRecognitionAlternative item(int index);

  /// The **`length`** read-only property of the
  /// [SpeechRecognitionResult] interface returns the length of the "array"
  /// — the number of [SpeechRecognitionAlternative] objects contained
  /// in the result (also referred to as "n-best alternatives".)
  ///
  /// The number of alternatives contained in the result depends on what the
  /// [SpeechRecognition.maxAlternatives] property was set to when the speech
  /// recognition was first initiated.
  external int get length;

  /// The **`isFinal`** read-only property of the
  /// [SpeechRecognitionResult] interface is a boolean value that states
  /// whether this result is final (`true`) or not (`false`) — if so,
  /// then this is the final time this result will be returned; if not, then
  /// this result is an
  /// interim result, and may be updated later on.
  external bool get isFinal;
}

/// The **`SpeechRecognitionResultList`** interface of the
/// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
/// represents a list of [SpeechRecognitionResult] objects, or a single one if
/// results are being captured in  mode.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognitionResultList).
extension type SpeechRecognitionResultList._(JSObject _) implements JSObject {
  /// The **`item`** getter of the
  /// [SpeechRecognitionResultList] interface is a standard getter — it allows
  /// [SpeechRecognitionResult] objects in the list to be accessed via array
  /// syntax.
  external SpeechRecognitionResult item(int index);

  /// The **`length`** read-only property of the
  /// [SpeechRecognitionResultList] interface returns the length of the
  /// "array" — the number of [SpeechRecognitionResult] objects in the
  /// list.
  external int get length;
}

/// The **`SpeechRecognitionEvent`** interface of the
/// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
/// represents the event object for the [SpeechRecognition.result_event] and
/// [SpeechRecognition.nomatch_event] events, and contains all the data
/// associated with an interim or final speech recognition result.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognitionEvent).
extension type SpeechRecognitionEvent._(JSObject _) implements Event, JSObject {
  /// The **`resultIndex`** read-only property of the
  /// [SpeechRecognitionEvent] interface returns the lowest index value result
  /// in
  /// the [SpeechRecognitionResultList] "array" that has actually changed.
  ///
  /// The [SpeechRecognitionResultList] object is not an array, but it has a
  /// getter that allows it to be accessed by array syntax.
  external int get resultIndex;

  /// The **`results`** read-only property of the
  /// [SpeechRecognitionEvent] interface returns a
  /// [SpeechRecognitionResultList] object representing all the speech
  /// recognition results for the current session.
  ///
  /// Specifically this object will contain all final results that have been
  /// returned,
  /// followed by the current best hypothesis for all interim results. When
  /// subsequent
  /// [SpeechRecognition.result_event] events are fired, interim results may be
  /// overwritten by a newer
  /// interim result or by a final result — they may even be removed, if they
  /// are at the end
  /// of the "results" array and the array length decreases. Final results on
  /// the other hand
  /// will not be overwritten or removed.
  external SpeechRecognitionResultList get results;
}

/// The **`SpeechSynthesis`** interface of the
/// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
/// is the controller interface for the speech service; this can be used to
/// retrieve information about the synthesis voices available on the device,
/// start and pause speech, and other commands besides.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesis).
extension type SpeechSynthesis._(JSObject _) implements EventTarget, JSObject {
  /// The **`speak()`** method of the [SpeechSynthesis]
  /// interface adds an [SpeechSynthesisUtterance] to the utterance
  /// queue; it will be spoken when any other utterances queued before it have
  /// been spoken.
  external void speak(SpeechSynthesisUtterance utterance);

  /// The **`cancel()`** method of the [SpeechSynthesis]
  /// interface removes all utterances from the utterance queue.
  ///
  /// If an utterance is currently being spoken, speaking will stop immediately.
  external void cancel();

  /// The **`pause()`** method of the [SpeechSynthesis]
  /// interface puts the `SpeechSynthesis` object into a paused state.
  external void pause();

  /// The **`resume()`** method of the [SpeechSynthesis]
  /// interface puts the `SpeechSynthesis` object into a non-paused state:
  /// resumes it if it was already paused.
  external void resume();

  /// The **`getVoices()`** method of the
  /// [SpeechSynthesis] interface returns a list of
  /// [SpeechSynthesisVoice] objects representing all the available voices on
  /// the
  /// current device.
  external JSArray<SpeechSynthesisVoice> getVoices();

  /// The **`pending`** read-only property of the
  /// [SpeechSynthesis] interface is a boolean value that returns
  /// `true` if the utterance queue contains as-yet-unspoken utterances.
  external bool get pending;

  /// The **`speaking`** read-only property of the
  /// [SpeechSynthesis] interface is a boolean value that returns
  /// `true` if an utterance is currently in the process of being spoken — even
  /// if `SpeechSynthesis` is in a
  /// [SpeechSynthesis.pause] state.
  external bool get speaking;

  /// The **`paused`** read-only property of the
  /// [SpeechSynthesis] interface is a boolean value that returns
  /// `true` if the `SpeechSynthesis` object is in a paused state, or `false` if
  /// not.
  ///
  /// It can be set to [SpeechSynthesis.pause] even if nothing is
  /// currently being spoken through it. If
  /// [SpeechSynthesisUtterance] are then added to the utterance
  /// queue, they will not be spoken until the `SpeechSynthesis` object is
  /// unpaused, using [SpeechSynthesis.resume].
  external bool get paused;
  external EventHandler get onvoiceschanged;
  external set onvoiceschanged(EventHandler value);
}

/// The **`SpeechSynthesisUtterance`** interface of the
/// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
/// represents a speech request.
/// It contains the content the speech service should read and information about
/// how to read it (e.g. language, pitch and volume.)
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisUtterance).
extension type SpeechSynthesisUtterance._(JSObject _)
    implements EventTarget, JSObject {
  external factory SpeechSynthesisUtterance([String text]);

  /// The **`text`** property of the
  /// [SpeechSynthesisUtterance] interface gets and sets the text that will be
  /// synthesized when the utterance is spoken.
  ///
  /// The text may be provided as plain text, or a well-formed
  /// [SSML](https://www.w3.org/TR/speech-synthesis/) document.
  /// The SSML tags will be stripped away by devices that don't support SSML.
  external String get text;
  external set text(String value);

  /// The **`lang`** property of the [SpeechSynthesisUtterance] interface gets
  /// and sets the language of the utterance.
  ///
  /// If unset, the app's (i.e. the `html`
  /// [`lang`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)
  /// value) lang will be used, or the user-agent default if that is unset too.
  external String get lang;
  external set lang(String value);

  /// The **`voice`** property of the [SpeechSynthesisUtterance] interface gets
  /// and sets the voice that will be used to speak the utterance.
  ///
  /// This should be set to one of the [SpeechSynthesisVoice] objects returned
  /// by [SpeechSynthesis.getVoices].
  /// If not set by the time the utterance is spoken, the voice used will be the
  /// most suitable default voice available for the utterance's
  /// [SpeechSynthesisUtterance.lang] setting.
  external SpeechSynthesisVoice? get voice;
  external set voice(SpeechSynthesisVoice? value);

  /// The **`volume`** property of the [SpeechSynthesisUtterance] interface gets
  /// and sets the volume that the utterance will be spoken at.
  ///
  /// If not set, the default value 1 will be used.
  external double get volume;
  external set volume(num value);

  /// The **`rate`** property of the [SpeechSynthesisUtterance] interface gets
  /// and sets the speed at which the utterance will be spoken at.
  ///
  /// If unset, a default value of 1 will be used.
  external double get rate;
  external set rate(num value);

  /// The **`pitch`** property of the [SpeechSynthesisUtterance] interface gets
  /// and sets the pitch at which the utterance will be spoken at.
  ///
  /// If unset, a default value of 1 will be used.
  external double get pitch;
  external set pitch(num value);
  external EventHandler get onstart;
  external set onstart(EventHandler value);
  external EventHandler get onend;
  external set onend(EventHandler value);
  external EventHandler get onerror;
  external set onerror(EventHandler value);
  external EventHandler get onpause;
  external set onpause(EventHandler value);
  external EventHandler get onresume;
  external set onresume(EventHandler value);
  external EventHandler get onmark;
  external set onmark(EventHandler value);
  external EventHandler get onboundary;
  external set onboundary(EventHandler value);
}

/// The **`SpeechSynthesisEvent`** interface of the
/// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
/// contains information about the current state of [SpeechSynthesisUtterance]
/// objects that have been processed in the speech service.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisEvent).
extension type SpeechSynthesisEvent._(JSObject _) implements Event, JSObject {
  external factory SpeechSynthesisEvent(
    String type,
    SpeechSynthesisEventInit eventInitDict,
  );

  /// The **`utterance`** read-only property of the [SpeechSynthesisUtterance]
  /// interface returns the [SpeechSynthesisUtterance] instance that the event
  /// was triggered on.
  external SpeechSynthesisUtterance get utterance;

  /// The **`charIndex`** read-only property of the [SpeechSynthesisUtterance]
  /// interface returns the index position of the character in
  /// [SpeechSynthesisUtterance.text] that was being spoken when the event was
  /// triggered.
  external int get charIndex;

  /// The read-only **`charLength`** property of the [SpeechSynthesisEvent]
  /// interface returns the number of characters left to be spoken after the
  /// character at the [SpeechSynthesisEvent.charIndex] position.
  ///
  /// If the speech engine can't determine it, it returns 0.
  external int get charLength;

  /// The **`elapsedTime`** read-only property of the [SpeechSynthesisEvent]
  /// returns the elapsed time in seconds, after the
  /// [SpeechSynthesisUtterance.text] started being spoken, at which the
  /// [event](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisUtterance#events)
  /// was triggered.
  external double get elapsedTime;

  /// The **`name`** read-only property of the [SpeechSynthesisUtterance]
  /// interface returns the name associated with certain types of events
  /// occurring as the [SpeechSynthesisUtterance.text] is being spoken:
  /// the name of the [SSML](https://www.w3.org/TR/speech-synthesis/#S3.3.2)
  /// marker reached in the case of a [SpeechSynthesisUtterance.mark_event]
  /// event, or the type of boundary reached in the case of a
  /// [SpeechSynthesisUtterance.boundary_event] event.
  external String get name;
}
extension type SpeechSynthesisEventInit._(JSObject _)
    implements EventInit, JSObject {
  external factory SpeechSynthesisEventInit({
    bool bubbles,
    bool cancelable,
    bool composed,
    required SpeechSynthesisUtterance utterance,
    int charIndex,
    int charLength,
    num elapsedTime,
    String name,
  });

  external SpeechSynthesisUtterance get utterance;
  external set utterance(SpeechSynthesisUtterance value);
  external int get charIndex;
  external set charIndex(int value);
  external int get charLength;
  external set charLength(int value);
  external double get elapsedTime;
  external set elapsedTime(num value);
  external String get name;
  external set name(String value);
}

/// The **`SpeechSynthesisErrorEvent`** interface of the
/// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
/// contains information about any errors that occur while processing
/// [SpeechSynthesisUtterance] objects in the speech service.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisErrorEvent).
extension type SpeechSynthesisErrorEvent._(JSObject _)
    implements SpeechSynthesisEvent, JSObject {
  external factory SpeechSynthesisErrorEvent(
    String type,
    SpeechSynthesisErrorEventInit eventInitDict,
  );

  /// The **`error`** property of the
  /// [SpeechSynthesisErrorEvent] interface returns an error code indicating
  /// what has gone wrong with a speech synthesis attempt.
  external SpeechSynthesisErrorCode get error;
}
extension type SpeechSynthesisErrorEventInit._(JSObject _)
    implements SpeechSynthesisEventInit, JSObject {
  external factory SpeechSynthesisErrorEventInit({
    bool bubbles,
    bool cancelable,
    bool composed,
    required SpeechSynthesisUtterance utterance,
    int charIndex,
    int charLength,
    num elapsedTime,
    String name,
    required SpeechSynthesisErrorCode error,
  });

  external SpeechSynthesisErrorCode get error;
  external set error(SpeechSynthesisErrorCode value);
}

/// The **`SpeechSynthesisVoice`** interface of the
/// [Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)
/// represents a voice that the system supports.
/// Every `SpeechSynthesisVoice` has its own relative speech service including
/// information about language, name and URI.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesisVoice).
extension type SpeechSynthesisVoice._(JSObject _) implements JSObject {
  /// The **`voiceURI`** read-only property of the
  /// [SpeechSynthesisVoice] interface returns the type of URI and location of
  /// the speech synthesis service for this voice.
  external String get voiceURI;

  /// The **`name`** read-only property of the
  /// [SpeechSynthesisVoice] interface returns a human-readable name that
  /// represents the voice.
  external String get name;

  /// The **`lang`** read-only property of the [SpeechSynthesisVoice] interface
  /// returns a BCP 47 language tag indicating the language of the voice.
  external String get lang;

  /// The **`localService`** read-only property of the
  /// [SpeechSynthesisVoice] interface returns a boolean value
  /// indicating whether the voice is supplied by a local speech synthesizer
  /// service
  /// (`true`), or a remote speech synthesizer service (`false`.)
  ///
  /// This property is provided to allow differentiation in the case that some
  /// voice options
  /// are provided by a remote service; it is possible that remote voices might
  /// have extra
  /// latency, bandwidth or cost associated with them, so such distinction may
  /// be useful.
  external bool get localService;
  @JS('default')
  external bool get default_;
}
