import ComponentBase from '../../utils/componentbase/ComponentBase';

export default Slider;

declare namespace Slider {
    /**
     * Callback for value changes.
     */
    type ValueChangeCallbackType = (newValue: number, oldValue: number) => void;

    /**
     * Slider configuration.
     */
    interface IConfig {
        /**
         * End points for the slider.
         */
        endPoints?: [
            { x: number, y: number },
            { x: number, y: number }
        ],
        /**
         * Initial value.
         */
        value?: number,
        /**
         * True to enable.
         */
        enable?: boolean,

        /**
         * Callback on value change.
         */
        valuechangeCallback?: ValueChangeCallbackType,
        /**
         * Callback scope for value change.
         */
        valuechangeCallbackScope?: Object
    }

    namespace Events {
        /**
         * Value change callback.
         */
        type ValueChangeCallbackType = (newValue: number, oldValue: number) => void;
    }
}

/**
 * Slider input component.
 */
declare class Slider extends ComponentBase {
    /**
     * Create a Slider component.
     * @param gameObject - Target game object.
     * @param config - Slider configuration.
     */
    constructor(
        gameObject: Phaser.GameObjects.GameObject,
        config?: Slider.IConfig
    );

    /**
     * Enable or disable the slider.
     * @param enable - True to enable.
     * @returns This instance.
     */
    setEnable(enable?: boolean): this;
    /**
     * Toggle enable state.
     * @returns This instance.
     */
    toggleEnable(): this;
    /**
     * True if enabled.
     */
    enable: boolean;

    /**
     * Set end points by coordinates.
     * @param p0x - Start x.
     * @param p0y - Start y.
     * @param p1x - End x.
     * @param p1y - End y.
     * @returns This instance.
     */
    setEndPoints(
        p0x: number,
        p0y: number,
        p1x: number,
        p1y: number
    ): this;

    /**
     * Set end points by point objects.
     * @param p0 - Start point.
     * @param p1 - End point.
     * @returns This instance.
     */
    setEndPoints(
        p0: { x: number, y: number },
        p1: { x: number, y: number }
    ): this;

    /**
     * Set end points by array.
     * @param points - End points array.
     * @returns This instance.
     */
    setEndPoints(
        points: [
            { x: number, y: number },
            { x: number, y: number }
        ]
    ): this;

    /**
     * Get value within optional range.
     * @param min - Minimum value.
     * @param max - Maximum value.
     * @returns Current value.
     */
    getValue(min?: number, max?: number): number;
    /**
     * Current value.
     */
    value: number;

    /**
     * Set current value.
     * @param newValue - Value to set.
     * @param min - Minimum value.
     * @param max - Maximum value.
     * @returns This instance.
     */
    setValue(
        newValue: number,
        min?: number,
        max?: number
    ): this;

    /**
     * Add to current value.
     * @param inc - Increment value.
     * @param min - Minimum value.
     * @param max - Maximum value.
     * @returns This instance.
     */
    addValue(
        inc: number,
        min?: number,
        max?: number
    ): this;

    /**
     * True if dragging is in progress.
     */
    readonly isDragging: boolean;
}
