import ComponentBase from '../../utils/componentbase/ComponentBase';

export default Boids;

declare namespace Boids {

    /**
     * Boids configuration.
     */
    interface IConfig {
        /**
         * Separation behavior parameters.
         */
        separation?: {
            /**
             * Separation weight.
             */
            weight?: number,
            /**
             * Separation distance.
             */
            distance?: number,
        },

        /**
         * Cohesion behavior parameters.
         */
        cohesion?: {
            /**
             * Cohesion weight.
             */
            weight?: number,
            /**
             * Cohesion distance.
             */
            distance?: number,
        },

        /**
         * Alignment behavior parameters.
         */
        alignment?: {
            /**
             * Alignment weight.
             */
            weight?: number,
            /**
             * Alignment distance.
             */
            distance?: number,
        },
    }
}

/**
 * Boids steering behavior component.
 */
declare class Boids extends ComponentBase {
    /**
     * Create a Boids component.
     * @param gameObject - Target game object.
     * @param config - Boids configuration.
     */
    constructor(
        gameObject: Phaser.GameObjects.GameObject,
        config?: Boids.IConfig
    );

    /**
     * Output steering vector.
     */
    readonly output: Phaser.Math.Vector2;

    /**
     * Set separation parameters.
     * @param weight - Separation weight.
     * @param distance - Separation distance.
     * @returns This instance.
     */
    setSeparationParameters(weight: number, distance: number): this;
    /**
     * Set cohesion parameters.
     * @param weight - Cohesion weight.
     * @param distance - Cohesion distance.
     * @returns This instance.
     */
    setCohesionParameters(weight: number, distance: number): this;
    /**
     * Set alignment parameters.
     * @param weight - Alignment weight.
     * @param distance - Alignment distance.
     * @returns This instance.
     */
    setAlignmentParameters(weight: number, distance: number): this;

    /**
     * Update steering based on neighbors.
     * @param neighbors - Neighbor game objects.
     * @returns This instance.
     */
    update(neighbors: Phaser.GameObjects.GameObject[]): this;
}
