function addNum (num1, num2) {
    let sq1, sq2, m;
    try {
        sq1 = num1.toString().split('.')[1].length;
    }
    catch (e) {
        sq1 = 0;
    }
    try {
        sq2 = num2.toString().split('.')[1].length;
    }
    catch (e) {
        sq2 = 0;
    }
    m = Math.pow(10, Math.max(sq1, sq2));
    return (Math.round(num1 * m) + Math.round(num2 * m)) / m;
}

Component({
    externalClasses: ['i-class'],

    properties: {
        // small || default || large
        size: String,
        value: {
            type: Number,
            value: 1
        },
        min: {
            type: Number,
            value: -Infinity
        },
        max: {
            type: Number,
            value: Infinity
        },
        step: {
            type: Number,
            value: 1
        }
    },
    

    methods: {
        handleChangeStep(e, type) {
            const { dataset = {} } = e.currentTarget;
            const { disabled } = dataset;
            const { step } = this.data;
            let { value } = this.data;

            if (disabled) return null;

            if (type === 'minus') {
                value = addNum(value, -step);
            } else if (type === 'plus') {
                value = addNum(value, step);
            }

            if (value < this.data.min || value > this.data.max) return null;

            this.handleEmit(value, type);
        },

        handleMinus(e) {
            this.handleChangeStep(e, 'minus');
        },

        handlePlus(e) {
            this.handleChangeStep(e, 'plus');
        },

        handleBlur(e) {
            let { value } = e.detail;
            const { min, max } = this.data;

            if (!value) {
                setTimeout(() => {
                    this.handleEmit(value);
                }, 16);
                return;
            }

            value = +value;
            if (value > max) {
                value = max;
            } else if (value < min) {
                value = min;
            }

            this.handleEmit(value);
        },
        handleEmit (value, type) {
            const data = {
                value: value
            };
            if (type) data.type = type;

            this.triggerEvent('change', data);
        }
    }
});