import TickTask from '../../utils/componentbase/TickTask';

export default Ship;

declare namespace Ship {

    /**
     * Cursor key set.
     */
    type CursorKeys = {
        /**
         * Up key.
         */
        up: Phaser.Input.Keyboard.Key,
        /**
         * Down key.
         */
        down: Phaser.Input.Keyboard.Key,
        /**
         * Left key.
         */
        left: Phaser.Input.Keyboard.Key,
        /**
         * Right key.
         */
        right: Phaser.Input.Keyboard.Key
    }

    /**
     * Ship configuration.
     */
    interface IConfig {

        /**
         * Maximum speed.
         */
        maxSpeed?: number,
        /**
         * Acceleration value.
         */
        acceleration?: number,
        /**
         * Drag value.
         */
        drag?: number,
        /**
         * Turn speed value.
         */
        turnSpeed?: number,
        /**
         * True to enable.
         */
        enable?: boolean,
        /**
         * True to wrap at bounds.
         */
        wrap?: boolean,
        /**
         * Padding for wrapping.
         */
        padding?: number,
        /**
         * Cursor keys.
         */
        cursorKeys?: CursorKeys
    }
}

/**
 * Ship movement component.
 */
declare class Ship extends TickTask {
    /**
     * Create a Ship component.
     * @param gameObject - Target game object.
     * @param config - Ship configuration.
     */
    constructor(
        gameObject: Phaser.GameObjects.GameObject,
        config?: Ship.IConfig
    );

    /**
     * Enable or disable the component.
     * @param enable - True to enable.
     * @returns This instance.
     */
    setEnable(enable?: boolean): this;
    /**
     * True if enabled.
     */
    enable: boolean;

    /**
     * Set cursor keys.
     * @param cursorKeys - Cursor keys set.
     * @returns This instance.
     */
    setCursorKeys(
        cursorKeys: Ship.CursorKeys
    ): this;
    /**
     * Cursor keys set.
     */
    cursorKeys: Ship.CursorKeys;

    /**
     * Set maximum speed.
     * @param maxSpeed - Max speed value.
     * @returns This instance.
     */
    setMaxSpeed(maxSpeed: number): this;
    /**
     * Maximum speed.
     */
    maxSpeed: number;

    /**
     * Set acceleration.
     * @param acceleration - Acceleration value.
     * @returns This instance.
     */
    setAcceleration(acceleration: number): this;
    /**
     * Acceleration value.
     */
    acceleration: number;

    /**
     * Set drag value.
     * @param drag - Drag value.
     * @returns This instance.
     */
    setDrag(drag: number): this;
    /**
     * Drag value.
     */
    drag: number;

    /**
     * Set turn speed.
     * @param angularVelocity - Turn speed value.
     * @returns This instance.
     */
    setTurnSpeed(angularVelocity: number): this;
    /**
     * Turn speed value.
     */
    angularVelocity: number;

    /**
     * Set wrap mode.
     * @param wrap - True to enable wrap.
     * @param padding - Wrap padding.
     * @returns This instance.
     */
    setWrapMode(
        wrap?: boolean,
        padding?: number
    ): this;
    /**
     * True if wrap mode is enabled.
     */
    wrap: boolean;
    /**
     * Wrap padding value.
     */
    padding: number;

    /**
     * True if moving left.
     */
    readonly isLeft: boolean;
    /**
     * True if moving right.
     */
    readonly isRight: boolean;
    /**
     * True if moving up.
     */
    readonly isUp: boolean;
    /**
     * True if moving down.
     */
    readonly isDown: boolean;
}
