// import * as Phaser from 'phaser';

export default TwoPointersTracer;

declare namespace TwoPointersTracer {
    /**
     * Pointer hit test callback.
     */
    type HitTestCallbackType = (
        /**
         * Target game object.
         */
        gameObject: Phaser.GameObjects.GameObject,
        /**
         * Pointer x.
         */
        x: number,
        /**
         * Pointer y.
         */
        y: number
    ) => boolean;

    /**
     * TwoPointersTracer configuration.
     */
    interface IConfig {
        /**
         * True to enable.
         */
        enable?: boolean,
        /**
         * Detection bounds.
         */
        bounds?: Phaser.Geom.Rectangle,
        /**
         * Event emitter override or true to use game object emitter.
         */
        eventEmitter?: boolean | Phaser.Events.EventEmitter,
    }

}

/**
 * Base class for two-pointer gesture tracking.
 */
declare class TwoPointersTracer extends Phaser.Events.EventEmitter {

    /**
     * True if enabled.
     */
    enable: boolean;
    /**
     * Enable or disable the tracer.
     * @param enable - True to enable.
     * @returns This instance.
     */
    setEnable(enable?: boolean): this;
    /**
     * Toggle enable state.
     * @returns This instance.
     */
    toggleEnable(): this;

    /**
     * Detection bounds.
     */
    bounds: Phaser.Geom.Rectangle | undefined;
    /**
     * Set detection bounds.
     * @param bounds - Bounds rectangle.
     * @returns This instance.
     */
    setDetectBounds(bounds?: Phaser.Geom.Rectangle): this;

    /**
     * Cancel dragging.
     * @returns This instance.
     */
    dragCancel(): this;

    /**
     * Active pointers.
     */
    pointers: Phaser.Input.Pointer[];
    /**
     * Distance between pointers.
     */
    readonly distanceBetween: number;
    /**
     * Angle between pointers in radians.
     */
    readonly angleBetween: number;
    /**
     * Center x between pointers.
     */
    readonly centerX: number;
    /**
     * Center y between pointers.
     */
    readonly centerY: number;
    /**
     * Previous center x.
     */
    readonly prevCenterX: number;
    /**
     * Previous center y.
     */
    readonly prevCenterY: number;
    /**
     * Movement delta x of center.
     */
    readonly movementCenterX: number;
    /**
     * Movement delta y of center.
     */
    readonly movementCenterY: number;
    /**
     * Drag vector for pointer 1.
     */
    readonly drag1Vector: { x: number, y: number };

    /**
     * Test if pointer 0 is in a game object.
     * @param gameObject - Target game object.
     * @param preTest - Optional pre-test callback.
     * @param postTest - Optional post-test callback.
     * @returns True if pointer 0 is in the game object.
     */
    isPointer0InGameObject(
        gameObject: Phaser.GameObjects.GameObject,
        preTest?: TwoPointersTracer.HitTestCallbackType,
        postTest?: TwoPointersTracer.HitTestCallbackType
    ): boolean;

    /**
     * Test if pointer 1 is in a game object.
     * @param gameObject - Target game object.
     * @param preTest - Optional pre-test callback.
     * @param postTest - Optional post-test callback.
     * @returns True if pointer 1 is in the game object.
     */
    isPointer1InGameObject(
        gameObject: Phaser.GameObjects.GameObject,
        preTest?: TwoPointersTracer.HitTestCallbackType,
        postTest?: TwoPointersTracer.HitTestCallbackType
    ): boolean;
}
