import { _decorator, Component, Node, Label } from 'cc';
import { StringUtil } from '../util/StringUtil';
const { ccclass, property, requireComponent } = _decorator;

@ccclass('RollingNumber')
@requireComponent([Label])
export class RollingNumber extends Component {

    private _text_lab: Label = null;
    private _current = 0;                       //当前值
    private _target = 0;                        //目标值
    private _duration = 0;                      //持续时间
    private _speed = 0;                         //动画速度
    private _playing = false;                   //动画是否播放
    private _limit = 0;                         //上限


    onLoad() {
        this._text_lab = this.getComponent(Label);
        this._text_lab.string = "0";
    }

    private _setValue(value: number) {
        this._current = value;
        this._text_lab.string = StringUtil.numberToTenThousand(value);
    }

    changeTo(target: number, duration: number = 1, limit: number = 999999) {
        this.stop();
        this._limit = limit;
        if (target > this._limit) {
            this._current = target;
            this._text_lab.string = StringUtil.numberToTenThousand(this._current);
        } else {
            if (duration > 0) {
                this._target = target;
                if (this._current - this._target == 1) {
                    this._setValue(target);
                    return;
                }
                this._duration = duration;
                this._speed = (this._target - this._current) / this._duration;
                this._playing = (target) ? true : false;
            } else {
                this._setValue(target);
            }
        }
    }

    addTo(value: number, duration: number = 1, limit: number = 999999) {
        this.stop();
        value = this._current + value;
        this.changeTo(value, duration, limit);
    }

    stop() {
        if (this._playing) {
            this._setValue(this._target);
            this._playing = false;
            this._target = -1;
        }
    }

    protected update(dt: number) {
        if (this._playing) {
            if (this._current == this._target) {
                this._playing = false;
            }
            let num = this._current + dt * this._speed;
            num = Math.ceil(num);
            if (this._over(num)) {
                num = this._target;
                this._playing = false;
            }
            this._setValue(num);
        }
    }

    private _over(num: number) {
        return (this._speed > 0) ? (num >= this._target) : (num <= this._target);
    }
}