import ComponentBase from '../../utils/componentbase/ComponentBase';

export default PathFollower;

declare namespace PathFollower {

    /**
     * PathFollower configuration.
     */
    interface IConfig {
        /**
         * Path to follow.
         */
        path?: Phaser.Curves.Path,
        /**
         * Initial t value.
         */
        t?: number,
        /**
         * True to rotate to path.
         */
        rotateToPath?: boolean,
        /**
         * Rotation offset in radians.
         */
        rotationOffset?: number,
        /**
         * Angle offset in radians.
         */
        angleOffset?: number,

        /**
         * Spaced points config or true to enable.
         */
        spacedPoints?: {
            /**
             * Number of divisions.
             */
            divisions?: number,
            /**
             * Step rate.
             */
            stepRate?: number
        } | boolean
    }
}

/**
 * Path follower behavior for a game object.
 */
declare class PathFollower extends ComponentBase {
    /**
     * Create a PathFollower behavior.
     * @param gameObject - Target game object.
     * @param config - PathFollower configuration.
     */
    constructor(
        gameObject: Phaser.GameObjects.GameObject,
        config?: PathFollower.IConfig
    );

    /**
     * Set t value along the path.
     * @param t - T value.
     * @returns This instance.
     */
    setT(t: number): this;
    /**
     * Current t value.
     */
    t: number;

    /**
     * Set path to follow.
     * @param path - Path instance.
     * @returns This instance.
     */
    setPath(path: Phaser.Curves.Path): this;
    /**
     * Current path.
     */
    path: Phaser.Curves.Path;

    /**
     * Set rotate-to-path settings.
     * @param rotateToPath - True to rotate to path.
     * @param rotationOffset - Rotation offset in radians.
     * @returns This instance.
     */
    setRotateToPath(
        rotateToPath: boolean,
        rotationOffset?: number
    ): this;
    /**
     * True to rotate to path.
     */
    rotateToPath: boolean;
    /**
     * Rotation offset in radians.
     */
    rotationOffset: number;

    /**
     * Set spaced points mode.
     * @param divisions - Divisions or true/false.
     * @param stepRate - Step rate.
     * @returns This instance.
     */
    setSpacedPointsMode(
        divisions?: number | boolean,
        stepRate?: number
    ): this;
}
