import '../../globals.js';
import Disposable, { DisposableOptions } from '../../axon/js/Disposable.js';
import DynamicProperty, { DynamicPropertyOptions } from '../../axon/js/DynamicProperty.js';
import TProperty from '../../axon/js/TProperty.js';
import TReadOnlyProperty from '../../axon/js/TReadOnlyProperty.js';
import IOType from '../../tandem/js/types/IOType.js';
import ResponsePacket, { ResolvedResponse } from './ResponsePacket.js';
export type TAlertable = ResolvedResponse | (() => string) | TReadOnlyProperty<string> | ResponsePacket | Utterance;
type AlertableNoUtterance = Exclude<TAlertable, Utterance>;
type SerializedUtterance = {
    alert: ResolvedResponse;
};
export type FeatureSpecificAnnouncingControlProperty = 'descriptionCanAnnounceProperty' | 'voicingCanAnnounceProperty';
type FeatureSpecificAnnouncingControlPropertySupported = {
    [Property in FeatureSpecificAnnouncingControlProperty]: AnnouncingControlProperty;
};
type SelfOptions = {
    alert?: AlertableNoUtterance;
    canAnnounceProperties?: TReadOnlyProperty<boolean>[];
    descriptionCanAnnounceProperties?: TReadOnlyProperty<boolean>[];
    voicingCanAnnounceProperties?: TReadOnlyProperty<boolean>[];
    predicate?: () => boolean;
    alertStableDelay?: number;
    alertMaximumDelay?: number;
    announcerOptions?: Record<string, unknown>;
    priority?: number;
};
export type UtteranceOptions = SelfOptions & DisposableOptions;
declare class Utterance extends Disposable implements FeatureSpecificAnnouncingControlPropertySupported {
    private readonly id;
    private _alert;
    readonly canAnnounceProperty: AnnouncingControlProperty;
    readonly descriptionCanAnnounceProperty: AnnouncingControlProperty;
    readonly voicingCanAnnounceProperty: AnnouncingControlProperty;
    readonly predicate: () => boolean;
    alertStableDelay: number;
    alertMaximumDelay: number;
    announcerOptions: Record<string, unknown>;
    priorityProperty: TProperty<number>;
    private previousAlertText;
    constructor(providedOptions?: UtteranceOptions);
    /**
     * @param alert
     * @param respectResponseCollectorProperties - if false, then do not listen to the value of responseCollector
     *                                              for creating the ResponsePacket conglomerate (just combine all available).
     */
    private static getAlertStringFromResponsePacket;
    /**
     * Get the string to alert. This function has potential to run a function to generate the string. Use this with caution.
     * Most often UtteranceQueue should be the only spot calling this.
     * @param respectResponseCollectorProperties=false - if false, then do not listen to the value of responseCollector
     *                                              for creating the ResponsePacket conglomerate (just combine all that are supplied).
     */
    getAlertText(respectResponseCollectorProperties?: boolean): ResolvedResponse;
    getAlert(): AlertableNoUtterance;
    get alert(): AlertableNoUtterance;
    set alert(alert: AlertableNoUtterance);
    setAlert(alert: AlertableNoUtterance): void;
    /**
     * Set the alertStableDelay time, see alertStableDelay option for more information.
     *
     * BEWARE! Why does the delay time need to be changed during the lifetime of an Utterance? It did for
     * https://github.com/phetsims/gravity-force-lab-basics/issues/146, but does it for you? Be sure there is good
     * reason changing this value.
     */
    setAlertStableDelay(delay: number): void;
    toString(): string;
    toStateObject(): SerializedUtterance;
    reset(): void;
    /**
     * Set the Properties controlling whether this Utterance can announce. All Properties must be
     * true for the alert content of this Utterance to be announced. These Properties are used in the implementation
     * of this.canAnnounceProperty. Setting new canAnnounceProperties has no impact on the listeners added to
     * this.canAnnounceProperty.
     */
    setCanAnnounceProperties(canAnnounceProperties: TReadOnlyProperty<boolean>[]): void;
    set canAnnounceProperties(canAnnounceProperties: TReadOnlyProperty<boolean>[]);
    get canAnnounceProperties(): TReadOnlyProperty<boolean>[];
    /**
     * Get the Properties that control whether the alert content for this Utterance can be announced.
     * All must be true for the announcement to occur.
     */
    getCanAnnounceProperties(): TReadOnlyProperty<boolean>[];
    /**
     * Set the Properties controlling whether this Utterance can announce to AriaLiveAnnouncer. All Properties must be
     * true for the alert content of this Utterance to be announced. These Properties are used in the implementation
     * of this.descriptionCanAnnounceProperty. Setting new descriptionCanAnnounceProperties has no impact on the
     * listeners added to this.descriptionCanAnnounceProperty. To announce to AriaLiveAnnouncer, this.canAnnounceProperty
     * must also be true
     */
    setDescriptionCanAnnounceProperties(descriptionCanAnnounceProperties: TReadOnlyProperty<boolean>[]): void;
    set descriptionCanAnnounceProperties(descriptionCanAnnounceProperties: TReadOnlyProperty<boolean>[]);
    get descriptionCanAnnounceProperties(): TReadOnlyProperty<boolean>[];
    /**
     * Get the Properties that control whether the alert content for this Utterance can be announced.
     * All must be true for the announcement to occur.
     */
    getDescriptionCanAnnounceProperties(): TReadOnlyProperty<boolean>[];
    /**
     * Set the Properties controlling whether this Utterance can announce to SpeechSynthesisAnnouncer. All Properties
     * must be true for the alert content of this Utterance to be announced. These Properties are used in the
     * implementation of this.voicingCanAnnounceProperty. Setting new voicingCanAnnounceProperties has no impact
     * on the listeners added to this.voicingCanAnnounceProperty. To announce to SpeechSynthesisAnnouncer,
     * this.canAnnounceProperty must also be true.
     */
    setVoicingCanAnnounceProperties(voicingCanAnnounceProperties: TReadOnlyProperty<boolean>[]): void;
    set voicingCanAnnounceProperties(voicingCanAnnounceProperties: TReadOnlyProperty<boolean>[]);
    get voicingCanAnnounceProperties(): TReadOnlyProperty<boolean>[];
    /**
     * Get the Properties that control whether the alert content for this Utterance can be announced.
     * All must be true for the announcement to occur.
     */
    getVoicingCanAnnounceProperties(): TReadOnlyProperty<boolean>[];
    /**
     * Make eligible for garbage collection.
     */
    dispose(): void;
    /**
     * @param alertable
     * @param respectResponseCollectorProperties=false - if false, then do not listen to the value of responseCollector
     *                                              for creating the ResponsePacket conglomerate (just combine all that are supplied).
     */
    static alertableToText(alertable: TAlertable, respectResponseCollectorProperties?: boolean): ResolvedResponse;
    static readonly TOP_PRIORITY = 10;
    static readonly HIGH_PRIORITY = 5;
    static readonly MEDIUM_PRIORITY = 2;
    static readonly DEFAULT_PRIORITY = 1;
    static readonly LOW_PRIORITY = 0;
    static readonly UtteranceIO: IOType<Utterance, SerializedUtterance, {
        alert: unknown;
    }>;
}
type AnnouncingControlPropertySelfOptions = {
    dependentProperties?: TReadOnlyProperty<boolean>[];
};
type AnnouncingControlPropertyParentOptions = DynamicPropertyOptions<boolean, boolean, TReadOnlyProperty<boolean>>;
type AnnouncingControlPropertyOptions = AnnouncingControlPropertySelfOptions & AnnouncingControlPropertyParentOptions;
declare class AnnouncingControlProperty extends DynamicProperty<boolean, boolean, TReadOnlyProperty<boolean>> {
    private _dependentProperties;
    private readonly implementationProperty;
    constructor(providedOptions?: AnnouncingControlPropertyOptions);
    /**
     * Set the Properties controlling this Property's value. All Properties must be true for this Property to be true.
     */
    setDependentProperties(dependentProperties: TReadOnlyProperty<boolean>[]): void;
    set dependentProperties(dependentProperties: TReadOnlyProperty<boolean>[]);
    get dependentProperties(): TReadOnlyProperty<boolean>[];
    /**
     * Get the Properties that control whether the alert content for this Utterance can be announced.
     * All must be true for the announcement to occur.
     */
    getDependentProperties(): TReadOnlyProperty<boolean>[];
    dispose(): void;
}
export default Utterance;
//# sourceMappingURL=Utterance.d.ts.map