import Base from '../base/Base';
import * as Geoms from '../../../plugins/gameobjects/shape/shapes/geoms';

export default Custom;

declare namespace Custom {

    /**
     * Name values for shape lookups.
     */
    type NameTypes = string | string[] | number;

    /**
     * Arc shape type.
     */
    type Arc = Geoms.Arc;
    /**
     * Circle shape type.
     */
    type Circle = Geoms.Circle;
    /**
     * Curve shape type.
     */
    type Curve = Geoms.Curve;
    /**
     * Ellipse shape type.
     */
    type Ellipse = Geoms.Ellipse;
    /**
     * Line shape type.
     */
    type Line = Geoms.Line;
    /**
     * Lines shape type.
     */
    type Lines = Geoms.Lines;
    /**
     * Rectangle shape type.
     */
    type Rectangle = Geoms.Rectangle;
    /**
     * Round rectangle shape type.
     */
    type RoundRectangle = Geoms.RoundRectangle;
    /**
     * Triangle shape type.
     */
    type Triangle = Geoms.Triangle;
    /**
     * Supported shape types.
     */
    type ShapeTypes = Arc | Circle | Curve | Ellipse |
        Line | Lines | Rectangle | RoundRectangle | Triangle;

    /**
     * Callback used to create shapes.
     */
    type CreateCallback = (this: Custom) => void;

    /**
     * Callback used to update shapes.
     */
    type UpdateCallback = (this: Custom) => void;

    /**
     * Configuration options for creating a Custom spinner.
     */
    interface IConfig extends Base.IConfig {
        /**
         * Shape creation configuration or callback.
         */
        create?: {
            /**
             * Arc shape names.
             */
            arc?: NameTypes,
            /**
             * Circle shape names.
             */
            circle?: NameTypes,
            /**
             * Ellipse shape names.
             */
            ellipse?: NameTypes,
            /**
             * Line shape names.
             */
            line?: NameTypes,
            /**
             * Lines shape names.
             */
            lines?: NameTypes,
            /**
             * Rectangle shape names.
             */
            rectangle?: NameTypes,
            /**
             * Triangle shape names.
             */
            triangle?: NameTypes,
        } | CreateCallback;

        /**
         * Update callback for custom shapes.
         */
        update?: UpdateCallback;

        /**
         * Custom spinner type name.
         */
        type?: string,
    }

}

/**
 * Custom spinner with user-defined shapes.
 */
declare class Custom extends Base {
    /**
     * Create a Custom spinner.
     *
     * @param scene - The Phaser.Scene that owns this spinner.
     * @param config - Configuration options for the spinner.
     */
    constructor(
        scene: Phaser.Scene,
        config?: Custom.IConfig
    )

    /**
     * Get a shape by name.
     *
     * @param name - The shape name.
     * @returns The shape instance.
     */
    getShape(name: string): Custom.ShapeTypes;
    /**
     * Get all shapes.
     *
     * @returns The list of shapes.
     */
    getShapes(): Custom.ShapeTypes[];
}
