import brightness from '@system.brightness';
import vibrator from '@system.vibrator';
import prompt from '@system.prompt';
let numbers,newNumbers;
export default{
    data:{
        score:0,
        best:0,
        tiles:[],
        isShow:false,
    },
    onInit() {
        this.isShow=false;
        this.score=0;
        this.tiles=[{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""},{text:""}];
        numbers=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        newNumbers=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        vibrator.vibrate({
            mode: 'short',
            success: function(ret) {
                console.log('tzx vibrate is successful');
            },
            fail: function(ret) {
                console.log('tzx vibrate is failed');
            },
            complete: function(ret) {
                console.log('tzx vibrate is completed');
            }
        });
        this.supplyNumber();
        this.supplyNumber();
        this.updateView();
        brightness.setKeepScreenOn({keepScreenOn: true,});
        brightness.setMode({mode: 1,});
    },
    supplyNumber(){
        let positions=[];
        for(let i=0;i<=15;i++){
            if(!newNumbers[i]) positions.push(i);
        }
        let h=Math.floor(Math.random()*positions.length);
        if (Math.random()<=0.8){
            newNumbers[positions[h]]=2;
        }else{
            newNumbers[positions[h]]=4;
        }
    },
    ToAbout(){
        prompt.showToast({
            message: '这是小草林开发的2048小游戏',
            duration: 4567,
        });
    },
    onSwipe(e) {
        newNumbers=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        let start=0,differ=0,step=0;
        switch(e.direction){
            case 'left':
                start=0;
                differ=1;
                step=4;
                break;
            case 'right':
                start=3;
                differ=-1;
                step=4;
                break;
            case 'up':
                start=0;
                differ=4;
                step=1;
                break;
            case 'down':
                start=12;
                differ=-4;
                step=1;
                break;
        }
        let ids;
        for (let j=0;j<=3;j++){
            ids=this.getIds(start, differ);
            let before=null;
            let noZeros=0;
            for(let k=0;k<=3;k++){
                let id=ids[k];
                let number=numbers[id];
                if (number!=0){
                    if(number==before){
                        this.score+=number*2;
                        newNumbers[ids[noZeros-1]]*=2;
                        before=null;
                    }else{
                        newNumbers[ids[noZeros]]=number;
                        before=number;
                        noZeros+=1;
                    }
                }
            }
            start+=step;
        }
        if(this.best>=this.score){
            this.best=this.best;
        }else{
            this.best=this.score;}
        if(numbers.toString()!=newNumbers.toString()){
            this.supplyNumber();
            this.updateView();
            newNumbers=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            if(this.isGameOver()==true){this.isShow=true;}
        }
    },
    getIds(start, differ){
        let ids=[];
        for (let z=4;z>=1;z--){
            ids.push(start);
            start+=differ;
        }
        return ids;
    },
    updateView() {
        for (let x=0;x<=15;x++) {
            if (newNumbers[x]!=0){
                this.tiles[x].text=newNumbers[x].toString();
            }else{
                this.tiles[x].text="";
            }
        }
        numbers=newNumbers;
    },
    isGameOver(){
        if(this.isGridsFull()==true && this.isGridsNotMergeable()==true){
            vibrator.vibrate({
                mode: 'long',
                success: function(ret) {
                    console.log('vibrate is successful');
                },
                fail: function(ret) {
                    console.log('vibrate is failed');
                },
                complete: function(ret) {
                    console.log('vibrate is completed');
                }
            });
            console.info('游戏结束');
            return true;
        }
    },
    isGridsFull(){
        if(numbers.indexOf(0)==-1){return true;}
    },
    isGridsNotMergeable(){
        for(let l=0;l<=15;l++){
            if(l<=14){
                if(numbers[l]==numbers[l+1]&&(l+1)%4!=0) return false;
            }
            if(l<=11){
                if(numbers[l]==numbers[l+4]) return false;
            }
        }
        return true;
    },
}
