export default SpiralCurve;

declare namespace SpiralCurve {
    /**
     * Configuration options for creating a SpiralCurve.
     */
    interface IConfig {
        /**
         * Start x position of the spiral center interpolation.
         */
        startX?: number,
        /**
         * End x position of the spiral center interpolation.
         */
        endX?: number,
        /**
         * Easing function name for x interpolation.
         */
        easeX?: string,
        /**
         * Start y position of the spiral center interpolation.
         */
        startY?: number,
        /**
         * End y position of the spiral center interpolation.
         */
        endY?: number,
        /**
         * Easing function name for y interpolation.
         */
        easeY?: string,

        /**
         * Fixed x position of the spiral center.
         */
        x?: number,
        /**
         * Fixed y position of the spiral center.
         */
        y?: number,

        /**
         * Start x radius interpolation value.
         */
        startXRadius?: number,
        /**
         * End x radius interpolation value.
         */
        endXRadius?: number,
        /**
         * Easing function name for x radius interpolation.
         */
        easeXRadius?: string,

        /**
         * Start y radius interpolation value.
         */
        startYRadius?: number,
        /**
         * End y radius interpolation value.
         */
        endYRadius?: number,
        /**
         * Easing function name for y radius interpolation.
         */
        easeYRadius?: string,

        /**
         * Start radius interpolation value.
         */
        startRadius?: number,
        /**
         * End radius interpolation value.
         */
        endRadius?: number,

        /**
         * Start angle in degrees.
         */
        startAngle?: number,
        /**
         * End angle in degrees.
         */
        endAngle?: number,
        /**
         * Easing function name for angle interpolation.
         */
        easeAngle?: string,

        /**
         * Curve rotation in degrees.
         */
        rotation?: number
    }
}

/**
 * Spiral curve implementation with interpolated center, radius, and angle.
 * Angle-related values are in degrees.
 */
declare class SpiralCurve extends Phaser.Curves.Curve {
    /**
     * Create a SpiralCurve from configuration.
     *
     * @param config - Spiral curve configuration.
     */
    constructor(
        config?: SpiralCurve.IConfig
    );

    /**
     * Create a SpiralCurve from primitive parameters.
     *
     * @param x - Center x position.
     * @param y - Center y position.
     * @param startRadius - Start radius.
     * @param endRadius - End radius.
     * @param startAngle - Start angle in degrees.
     * @param endAngle - End angle in degrees.
     * @param rotation - Curve rotation in degrees.
     */
    constructor(
        x?: number,
        y?: number,
        startRadius?: number,
        endRadius?: number,
        startAngle?: number,
        endAngle?: number,
        rotation?: number
    );

    /**
     * Set start x position.
     *
     * @param x - Start x position.
     * @returns This SpiralCurve instance.
     */
    setStartX(x: number): this;
    /**
     * Set start y position.
     *
     * @param y - Start y position.
     * @returns This SpiralCurve instance.
     */
    setStartY(y: number): this;
    /**
     * Start x position.
     */
    startX: number;
    /**
     * Start y position.
     */
    startY: number;
    /**
     * Start point vector.
     */
    readonly p0: { x: number, y: number };

    /**
     * Set end x position.
     *
     * @param x - End x position.
     * @returns This SpiralCurve instance.
     */
    setEndX(x: number): this;
    /**
     * Set end y position.
     *
     * @param y - End y position.
     * @returns This SpiralCurve instance.
     */
    setEndY(y: number): this;
    /**
     * End x position.
     */
    endX: number;
    /**
     * End y position.
     */
    endY: number;
    /**
     * End point vector.
     */
    readonly p1: { x: number, y: number };

    /**
     * Set start x radius.
     *
     * @param radius - Start x radius.
     * @returns This SpiralCurve instance.
     */
    setStartXRadius(radius: number): this;
    /**
     * Set start y radius.
     *
     * @param radius - Start y radius.
     * @returns This SpiralCurve instance.
     */
    setStartYRadius(radius: number): this;
    /**
     * Start x radius.
     */
    startXRadius: number;
    /**
     * Start y radius.
     */
    startYRadius: number;
    /**
     * Set end x radius.
     *
     * @param radius - End x radius.
     * @returns This SpiralCurve instance.
     */
    setEndXRadius(radius: number): this;
    /**
     * Set end y radius.
     *
     * @param radius - End y radius.
     * @returns This SpiralCurve instance.
     */
    setEndYRadius(radius: number): this;
    /**
     * End x radius.
     */
    endXRadius: number;
    /**
     * End y radius.
     */
    endYRadius: number;

    /**
     * Set start angle in degrees.
     *
     * @param degrees - Start angle in degrees.
     * @returns This SpiralCurve instance.
     */
    setStartAngle(degrees: number): this;
    /**
     * Set end angle in degrees.
     *
     * @param degrees - End angle in degrees.
     * @returns This SpiralCurve instance.
     */
    setEndAngle(degrees: number): this;
    /**
     * Start angle in degrees.
     */
    startAngle: number;
    /**
     * End angle in degrees.
     */
    endAngle: number;
}
