import Base from '../base/Base';

declare namespace AIO {
    /**
     * Animation mode names for the spinner.
     */
    type AnimationModeType = 'arrow' | 'audio' | 'ball' | 'bars' | 'box' | 'clock' |
        'cube' | 'dots' | 'facebook' | 'grid' | 'hearts' | 'ios' | 'oribit' | 'oval' |
        'pie' | 'puff' | 'radio' | 'rings' | 'spinner';

    /**
     * Direction values for the animation.
     */
    type DirectionType = 0 | 'right' | 1 | 'down' | 2 | 'left' | 3 | 'up';

    /**
     * Reset configuration for AIO.
     */
    interface IResetFromConfig extends Base.IResetFromConfig {
        /**
         * Direction for the animation.
         */
        direction?: DirectionType
    }

    /**
     * Configuration options for creating an AIO spinner.
     */
    interface IConfig extends Base.IConfig {
        /**
         * Initial animation mode.
         */
        animationMode?: AnimationModeType,
    }
}

/**
 * Spinner that can switch between multiple animation modes.
 */
declare class AIO extends Base {
    /**
     * Create an AIO spinner.
     *
     * @param scene - The Phaser.Scene that owns this spinner.
     * @param config - Configuration options for the spinner.
     */
    constructor(
        scene: Phaser.Scene,
        config?: AIO.IConfig
    )

    /**
     * Set the animation mode.
     *
     * @param mode - The animation mode to use.
     * @param config - Reset configuration.
     * @returns This AIO instance.
     */
    setAnimationMode(
        mode?: AIO.AnimationModeType,
        config?: AIO.IResetFromConfig
    ): this;

    /**
     * Pick a random animation mode.
     *
     * @param config - Reset configuration.
     * @returns This AIO instance.
     */
    setRandomAnimationMode(
        config?: AIO.IResetFromConfig
    ): this;

    /**
     * Current animation mode.
     */
    animationMode: AIO.AnimationModeType;
}

export default AIO;
