import Canvas from '../canvas/Canvas';

// import * as Phaser from 'phaser';
export default LineProgress;

declare namespace LineProgress {

    /**
     * Callback fired when progress value changes.
     */
    type ValueChangeCallbackType = (
        /**
         * New normalized value.
         */
        newValue: number,
        /**
         * Previous normalized value.
         */
        oldValue: number,
        /**
         * Line progress instance.
         */
        circularProgress: LineProgress
    ) => void;

    /**
     * Configuration options for creating line progress canvas.
     */
    interface IConfig {
        /**
         * Initial x position.
         */
        x?: number,
        /**
         * Initial y position.
         */
        y?: number,
        /**
         * Initial width.
         */
        width?: number,
        /**
         * Initial height.
         */
        height?: number,
        /**
         * Canvas texture resolution scale.
         */
        resolution?: number,

        /**
         * Track fill color.
         */
        trackColor?: string | number,
        /**
         * Track thickness.
         */
        trackThickness?: number,
        /**
         * Track stroke color.
         */
        trackStrokeColor?: string | number,
        /**
         * Bar primary color.
         */
        barColor?: string | number,
        /**
         * Bar secondary color for gradient.
         */
        barColor2?: string | number,
        /**
         * Set to true to use horizontal gradient direction.
         */
        isHorizontalGradient?: boolean,

        /**
         * X skew amount.
         */
        skewX?: number,

        /**
         * Set to true for right-to-left fill direction.
         */
        rtl?: boolean,

        /**
         * Initial normalized value.
         */
        value?: number,

        easeValue?: {
            /**
             * Ease duration in milliseconds.
             */
            duration?: number,
            /**
             * Ease function name.
             */
            ease?: string
        },

        /**
         * Callback fired when value changes.
         */
        valuechangeCallback: ValueChangeCallbackType,
    }

    /**
     * Event callback types emitted by line progress.
     */
    namespace Events {
        /**
         * Callback fired when progress value changes.
         */
        type ValueChangeCallbackType = (
            /**
             * New normalized value.
             */
            newValue: number,
            /**
             * Previous normalized value.
             */
            oldValue: number,
            /**
             * Line progress instance.
             */
            circularProgress: LineProgress
        ) => void;
    }
}

/**
 * Canvas-based line progress bar game object.
 */
declare class LineProgress extends Canvas {
    /**
     * Create line progress by configuration object.
     *
     * @param scene - Scene that owns this game object.
     * @param config - Optional progress configuration.
     */
    constructor(
        scene: Phaser.Scene,
        config?: LineProgress.IConfig
    );

    /**
     * Create line progress with position and size.
     *
     * @param scene - Scene that owns this game object.
     * @param x - Initial x position.
     * @param y - Initial y position.
     * @param width - Initial width.
     * @param height - Initial height.
     * @param config - Optional progress configuration.
     */
    constructor(
        scene: Phaser.Scene,
        x?: number,
        y?: number,
        width?: number,
        height?: number,
        config?: LineProgress.IConfig
    );

    /**
     * Create line progress with quick bar color and value setup.
     *
     * @param scene - Scene that owns this game object.
     * @param x - Initial x position.
     * @param y - Initial y position.
     * @param width - Initial width.
     * @param height - Initial height.
     * @param barColor - Bar color.
     * @param value - Initial normalized value.
     * @param config - Optional progress configuration.
     */
    constructor(
        scene: Phaser.Scene,
        x?: number,
        y?: number,
        width?: number,
        height?: number,
        barColor?: string | number,
        value?: number,
        config?: LineProgress.IConfig
    );

    /**
     * Current normalized value.
     */
    value: number;
    /**
     * Get value, optionally mapped to a custom range.
     *
     * @param min - Optional minimum of output range.
     * @param max - Optional maximum of output range.
     * @returns Current value.
     */
    getValue(
        min?: number,
        max?: number
    ): number;
    /**
     * Set value, optionally by mapping from a custom range.
     *
     * @param value - Value to set.
     * @param min - Optional minimum of input range.
     * @param max - Optional maximum of input range.
     * @returns This game object.
     */
    setValue(
        value?: number,
        min?: number,
        max?: number
    ): this;
    /**
     * Add delta to current value.
     *
     * @param inc - Increment value.
     * @param min - Optional minimum of input range.
     * @param max - Optional maximum of input range.
     * @returns This game object.
     */
    addValue(
        inc?: number,
        min?: number,
        max?: number
    ): this;

    /**
     * Ease value to target.
     *
     * @param value - Target value.
     * @param min - Optional minimum of input range.
     * @param max - Optional maximum of input range.
     * @returns This game object.
     */
    easeValueTo(
        value?: number,
        min?: number,
        max?: number
    ): this;
    /**
     * Stop current value easing.
     *
     * @returns This game object.
     */
    stopEaseValue(): this;
    /**
     * Set ease duration.
     *
     * @param duration - Duration in milliseconds.
     * @returns This game object.
     */
    setEaseValueDuration(duration: number): this;
    /**
     * Set ease function.
     *
     * @param ease - Ease function name.
     * @returns This game object.
     */
    setEaseValueFunction(ease: string): this;

    /**
     * Current track color.
     */
    trackColor: string;
    /**
     * Set track color.
     *
     * @param radius - Track color value.
     * @returns This game object.
     */
    setTrackColor(radius?: string | number): this;

    /**
     * Current track stroke thickness.
     */
    trackStrokeThickness: number;
    /**
     * Current track stroke color.
     */
    trackStrokeColor: string;
    /**
     * Set track stroke style.
     *
     * @param lineWidth - Stroke thickness.
     * @param color - Stroke color.
     * @returns This game object.
     */
    setTrackStroke(
        lineWidth?: number,
        color?: string | number
    ): this;

    /**
     * Current bar primary color.
     */
    barColor: string;
    /**
     * Current bar secondary color.
     */
    barColor2: string;
    /**
     * Current gradient direction flag.
     */
    isHorizontalGradient: boolean;
    /**
     * Set bar colors and gradient direction.
     *
     * @param barColor - Primary bar color.
     * @param barColor2 - Secondary bar color.
     * @param isHorizontalGradient - True for horizontal gradient.
     * @returns This game object.
     */
    setBarColor(
        barColor?: string | number,
        barColor2?: string | number,
        isHorizontalGradient?: boolean
    ): this;

    /**
     * Current X skew value.
     */
    skewX: number;
    /**
     * Set X skew value.
     *
     * @param skewX - X skew amount.
     * @returns This game object.
     */
    setSkewX(skewX: number): this;

    /**
     * Current right-to-left flag.
     */
    rtl: boolean;
    /**
     * Set right-to-left fill direction.
     *
     * @param enable - True to enable right-to-left direction.
     * @returns This game object.
     */
    setRTL(enable?: boolean): this;
}
