// import * as Phaser from 'phaser';
import Label from '../label/Label';


export default Toast;

declare namespace Toast {

    interface IConfig extends Label.IConfig {
        /**
         * Duration configuration.
         */
        duration?: {
            /**
             * Transit-in duration in ms.
             */
            in?: number,
            /**
             * Display duration in ms.
             */
            hold?: number,
            /**
             * Transit-out duration in ms.
             */
            out?: number,
        },

        /**
         * Transit-in mode or custom callback.
         */
        transitIn?: 0 | 1 | 'popUp' | 'fadeIn' |
        ((toast: Toast, duration: number) => void),

        /**
         * Transit-out mode or custom callback.
         */
        transitOut?: 0 | 1 | 'scaleDown' | 'fadeOut' |
        ((toast: Toast, duration: number) => void),
    }
}

/**
 * Toast notification label with queued messages and transitions.
 * @remarks Uses timed transit-in, hold, and transit-out animations.
 */
declare class Toast extends Label {
    /**
     * Create a toast.
     * @param scene - The Scene to which this object belongs.
     * @param config - Configuration options.
     */
    constructor(
        scene: Phaser.Scene,
        config?: Toast.IConfig
    );

    /**
     * Show a message string.
     * @param message - Message text.
     * @returns This instance.
     */
    showMessage(
        message: string
    ): this;
    /**
     * Show a message using a callback.
     * @param message - Callback invoked to configure the toast.
     * @returns This instance.
     */
    showMessage(
        message: (toast: Toast) => void
    ): this;
    /**
     * True if a message is currently playing.
     */
    readonly isShowingMessage: boolean;

    /**
     * Remove all queued messages.
     * @returns This instance.
     */
    removeAllMessages(): this;

    /**
     * Transit-in duration in ms.
     */
    transitInTime: number;
    /**
     * Set transit-in duration.
     * @param time - Duration in ms.
     * @returns This instance.
     */
    setTransitInTime(time: number): this;
    /**
     * Display duration in ms.
     */
    displayTime: number;
    /**
     * Set display duration.
     * @param time - Duration in ms.
     * @returns This instance.
     */
    setDisplayTime(time: number): this;
    /**
     * Transit-out duration in ms.
     */
    transitOutTime: number;
    /**
     * Set transit-out duration.
     * @param time - Duration in ms.
     * @returns This instance.
     */
    setTransitOutTime(time: number): this;

    /**
     * Set transit-in callback or mode.
     * @param callback - Mode or custom callback.
     * @returns This instance.
     */
    setTransitInCallback(
        callback: 0 | 1 | 'popUp' | 'fadeIn' |
            ((toast: Toast, duration: number) => void)
    ): this;
    /**
     * Set transit-out callback or mode.
     * @param callback - Mode or custom callback.
     * @returns This instance.
     */
    setTransitOutCallback(
        callback: 0 | 1 | 'scaleDown' | 'fadeOut' |
            ((toast: Toast, duration: number) => void)
    ): this;
}
