import NameValueLabel from '../namevaluelabel/NameValueLabel';
import LevelCounter from '../../../plugins/levelcounter';

export default ExpBar;

declare namespace ExpBar {
    /**
     * Configuration options for creating an experience bar.
     */
    interface IConfig extends NameValueLabel.IConfig {
        /**
         * Total easing duration used for exp-bar transitions.
         */
        easeDuration?: number,

        /**
         * Level counter configuration.
         */
        levelCounter?: LevelCounter.IConfig,

    }
}

/**
 * Name-value label specialized for experience and level progression display.
 */
declare class ExpBar extends NameValueLabel {
    /**
     * Create an experience bar component.
     *
     * @param scene - Scene that owns this component.
     * @param config - Optional experience bar configuration.
     */
    constructor(
        scene: Phaser.Scene,
        config?: ExpBar.IConfig
    );

    /**
     * Current experience value.
     */
    exp: number;
    /**
     * Current level.
     */
    level: number;
    /**
     * Required exp value to reach the next level.
     */
    readonly requiredExp: number;

    /**
     * Set total easing duration for exp transitions.
     *
     * @param duration - Easing duration in milliseconds.
     * @returns This component instance.
     */
    setTotalEaseDuration(duration: number): this;

    /**
     * Set level-exp table.
     *
     * @param table - Level counter table data.
     * @returns This component instance.
     */
    setExpTable(table: LevelCounter.TableType): this;

    /**
     * Reset experience value directly.
     *
     * @param exp - Experience value to assign.
     * @returns This component instance.
     */
    resetExp(exp: number): this;

    /**
     * Get current experience value.
     *
     * @returns Current experience.
     */
    getExp(): number;
    /**
     * Get required experience value for a level.
     *
     * @param level - Target level.
     * @returns Required experience at the target level.
     */
    getExp(level: number): number;

    /**
     * Get current level.
     *
     * @returns Current level.
     */
    getLevel(): number;
    /**
     * Resolve level from experience.
     *
     * @param exp - Experience value.
     * @param level - Optional start level hint.
     * @returns Resolved level.
     */
    getLevel(
        exp: number,
        level?: number
    ): number;

    /**
     * Get required additional exp to the next level.
     *
     * @param level - Optional current level override.
     * @param exp - Optional current exp override.
     * @returns Required exp to next level.
     */
    getRequiredExpToNextLevel(
        level?: number,
        exp?: number
    ): number;

    /**
     * Increase experience by an increment.
     *
     * @param incExp - Experience increment.
     * @returns This component instance.
     */
    gainExp(incExp: number): this;

    /**
     * Set experience value.
     *
     * @param exp - Experience value to assign.
     * @returns This component instance.
     */
    setExp(exp: number): this;

    /**
     * Set level directly.
     *
     * @param level - Level value to assign.
     * @returns This component instance.
     */
    setLevel(level: number): this;

}
