// import * as Phaser from 'phaser';
import Sizer from '../sizer/Sizer';

export default ToastQueue;

declare namespace ToastQueue {
    /**
     * Message payload type accepted by toast queue.
     */
    type MessageType = string | Object;

    /**
     * Callback used to create a message label object.
     */
    type CreateMessageLabelCallbackType = (
        /**
         * Scene that owns the created label.
         */
        scene: Phaser.Scene,
        /**
         * Message payload to display.
         */
        message: MessageType,
        /**
         * Toast queue instance.
         */
        toastQueue: ToastQueue
    ) => Phaser.GameObjects.GameObject;

    /**
     * Callback used to run toast transition animations.
     */
    type TransitionCallbackType = (
        /**
         * Target message label.
         */
        messageLabel: Phaser.GameObjects.GameObject,
        /**
         * Transition duration in milliseconds.
         */
        duration: number,
        /**
         * Toast queue instance.
         */
        toastQueue: ToastQueue
    ) => void;

    /**
     * Configuration options for creating a toast queue.
     */
    interface IConfig extends Sizer.IConfig {
        /**
         * Callback used to create message labels.
         */
        createMessageLabelCallback: CreateMessageLabelCallbackType,

        /**
         * Queue growth direction.
         */
        queueDirection?: 1 | 0 | 'bottom-to-top' | 'top-to-bottom' | 'right-to-left' | 'left-to-right',

        duration?: {
            /**
             * Transition-in duration.
             */
            in?: number,
            /**
             * Display duration.
             */
            hold?: number,
            /**
             * Transition-out duration.
             */
            out?: number,
        },

        /**
         * Transition-in callback.
         */
        transitIn?: TransitionCallbackType,

        /**
         * Transition-out callback.
         */
        transitOut?: TransitionCallbackType,
    }
}

/**
 * Queue-based toast message container.
 */
declare class ToastQueue extends Sizer {
    /**
     * Create a toast queue component.
     *
     * @param scene - Scene that owns this component.
     * @param config - Optional toast queue configuration.
     */
    constructor(
        scene: Phaser.Scene,
        config?: ToastQueue.IConfig
    );

    /**
     * Show a message as a toast item.
     *
     * @param message - Message payload to display.
     * @returns This component instance.
     */
    showMessage(
        message: ToastQueue.MessageType
    ): this;

    /**
     * Remove a specific message label.
     *
     * @param messageLabel - Message label to remove.
     * @returns This component instance.
     */
    removeMessage(messageLabel: Phaser.GameObjects.GameObject): this;
    /**
     * Remove all queued message labels.
     *
     * @returns This component instance.
     */
    removeAllMessages(): this;

    /**
     * Current transition-in time in milliseconds.
     */
    transitInTime: number;
    /**
     * Set transition-in time.
     *
     * @param time - Duration in milliseconds.
     * @returns This component instance.
     */
    setTransitInTime(time: number): this;
    /**
     * Current display time in milliseconds.
     */
    displayTime: number;
    /**
     * Set display time.
     *
     * @param time - Duration in milliseconds.
     * @returns This component instance.
     */
    setDisplayTime(time: number): this;
    /**
     * Current transition-out time in milliseconds.
     */
    transitOutTime: number;
    /**
     * Set transition-out time.
     *
     * @param time - Duration in milliseconds.
     * @returns This component instance.
     */
    setTransitOutTime(time: number): this;

    /**
     * Set transition-in callback.
     *
     * @param callback - Transition callback.
     * @returns This component instance.
     */
    setTransitInCallback(
        callback: ToastQueue.TransitionCallbackType
    ): this;
    /**
     * Set transition-out callback.
     *
     * @param callback - Transition callback.
     * @returns This component instance.
     */
    setTransitOutCallback(
        callback: ToastQueue.TransitionCallbackType
    ): this;
}
