import GOManager from '../../gameobject/gomanager/GOManager';

export default SpriteManager;

declare namespace SpriteManager {

    /**
     * Callback to create a game object.
     *
     * @param scene - Scene instance.
     * @param textureKey - Texture key.
     * @param frameName - Frame name.
     * @returns Created game object.
     */
    type CreateCallbackType = (
        scene: Phaser.Scene,
        textureKey: string,
        frameName: string | number
    ) => Phaser.GameObjects.GameObject;

    /**
     * Configuration options for creating a SpriteManager.
     */
    interface IConfig extends GOManager.IConfig {
        /**
         * Built-in or custom create callback.
         */
        createCallback?: 'sprite' | 'image' | CreateCallbackType,
    }
}

/**
 * Manager for sprite and image game objects.
 */
declare class SpriteManager extends GOManager {
    /**
     * Create a SpriteManager.
     *
     * @param scene - Scene instance.
     * @param config - Configuration options.
     */
    constructor(
        scene: Phaser.Scene,
        config?: SpriteManager.IConfig
    );

    /**
     * Add a managed sprite or image.
     *
     * @param name - Managed object name.
     * @param textureKey - Texture key.
     * @param frameName - Frame name.
     * @returns This SpriteManager instance.
     */
    add(
        name: string,
        textureKey: string,
        frameName?: string | number
    ): this;

    /**
     * Set create-game-object callback.
     *
     * @param callback - Built-in or custom callback.
     * @returns This SpriteManager instance.
     */
    setCreateGameObjectCallback(
        callback?: 'sprite' | 'image' | SpriteManager.CreateCallbackType
    ): this;

    /**
     * Play animation on a managed object.
     *
     * @param name - Managed object name.
     * @param key - Animation key.
     * @returns This SpriteManager instance.
     */
    playAnimation(
        name: string,
        key: string
    ): this;

    /**
     * Stop animation on a managed object.
     *
     * @param name - Managed object name.
     * @returns This SpriteManager instance.
     */
    stopAnimation(name: string): this;

    /**
     * Chain animation(s) on a managed object.
     *
     * @param name - Managed object name.
     * @param keys - Animation key(s) or play config.
     * @returns This SpriteManager instance.
     */
    chainAnimation(
        name: string,
        keys: string | string[] | Phaser.Types.Animations.PlayAnimationConfig | Phaser.Types.Animations.PlayAnimationConfig[]
    ): this;

    /**
     * Pause animation on a managed object.
     *
     * @param name - Managed object name.
     * @returns This SpriteManager instance.
     */
    pauseAnimation(name: string): this;

    /**
     * Set texture on a managed object.
     *
     * @param name - Managed object name.
     * @param textureKey - Texture key.
     * @param frameName - Frame name.
     * @returns This SpriteManager instance.
     */
    setTexture(
        name: string,
        textureKey: string,
        frameName: string | number
    ): this;
}
