 /*
* touch事件判断方式
* https://github.com/madrobby/zepto/blob/master/src/touch.js#files
*/
function swipeDirection(x1, x2, y1, y2) {
    return Math.abs(x1 - x2) >=
    Math.abs(y1 - y2) ? (x1 - x2 > 0 ? 'Left' : 'Right') : (y1 - y2 > 0 ? 'Up' : 'Down')
}

Component({
    externalClasses: ['i-class','wrap-class'],
    properties: {
        actions: {
            value: [],
            type: Array,
            observer : '_updateButtonSize'
        },
        unclosable : {
            value : false,
            type : Boolean
        },
        toggle : {
            value : false,
            type : Boolean,
            observer : 'closeButtonGroup'
        },
        operateWidth : {
            type : Number,
            value : 160
        }
    },
    options: {
        // 在组件定义时的选项中启用多slot支持
        multipleSlots: true
    },
    data : {
        //touch start position
        tStart : {
            pageX : 0,
            pageY : 0
        },
        //限制滑动距离
        limitMove : 0,
        //element move position
        position : {
            pageX : 0,
            pageY : 0
        }
    },
    methods : {
        //阻止事件冒泡
        loop(){},
        _updateButtonSize(){
            const actions = this.data.actions;
            if( actions.length > 0 ){
                const query = wx.createSelectorQuery().in(this);
                let limitMovePosition = 0;
                actions.forEach(item => {
                    limitMovePosition += item.width || 0;
                });
                this.data.limitMove = limitMovePosition;
                /*
                    * 动态获取每个传进值的按钮尺寸不能正确获取，在安卓上少了6px
                    * 暂时实现需要在actions里面传递宽度
                    * 需要后期调研
                */
                //query.selectAll('.i-swipeout-button-right-item').boundingClientRect((rects)=>{
                //     if( rects ){
                //         console.log(rects,1111111)
                //         rects.forEach(item => {
                //             limitMovePosition += item.width;
                //         });
                //         this.data.limitMove = limitMovePosition;
                //         console.log(limitMovePosition,111111111)
                //     }
                // }).exec()
            }else{
                this.data.limitMove = this.data.operateWidth;
                
            }
        },
        handlerTouchstart(event){
            const touches = event.touches ? event.touches[0] : {};
            const tStart = this.data.tStart;
            if( touches ){
                for( let i in tStart ){
                    if( touches[i] ){
                        tStart[i] = touches[i];
                    }
                }
            }
        },
        swipper(touches){
            const data = this.data;
            const start = data.tStart;
            const spacing = {
                pageX : touches.pageX - start.pageX,
                pageY : touches.pageY - start.pageY
            }
            if( data.limitMove <  Math.abs( spacing.pageX ) ){
                spacing.pageX = -data.limitMove;
                
            }
            this.setData({
                'position' : spacing
            })
        },
        handlerTouchmove(event){
            const start = this.data.tStart;
            const touches = event.touches ? event.touches[0] : {};
            if( touches ){
                const direction = swipeDirection( start.pageX,touches.pageX,start.pageY,touches.pageY );
                if( direction === 'Left' ){
                    this.swipper( touches );
                }
            }
        },
        handlerTouchend(event){
            const start = this.data.tStart;
            const touches = event.changedTouches ? event.changedTouches[0] : {};
            if( touches ){
                const direction = swipeDirection( start.pageX,touches.pageX,start.pageY,touches.pageY );
                const spacing = {
                    pageX : touches.pageX - start.pageX,
                    pageY : touches.pageY - start.pageY
                }
                if( Math.abs( spacing.pageX ) >= 40 && direction === "Left" ){
                    spacing.pageX = spacing.pageX  < 0 ? - this.data.limitMove : this.data.limitMove;
                }else{
                    spacing.pageX = 0;
                }
                this.setData({
                    'position' : spacing
                })
            }
        },
        handlerButton(event){
            if( !this.data.unclosable ){
                this.closeButtonGroup();
            }
            const dataset = event.currentTarget.dataset;
            this.triggerEvent('change',{
                index : dataset.index
            })
        },
        closeButtonGroup(){
            this.setData({
                'position' : {pageX : 0,pageY : 0}
            })
        },
        //控制自定义组件
        handlerParentButton(event){
            if( !this.data.unclosable ){
                this.closeButtonGroup();
            }
        }
    },
    ready(){
        this._updateButtonSize();
    }
});
