import User from "../../../FrameWork/User/User"
import Common5 from "../../../Platform/th/Common5"
// import MeiNvZhaoMuManager, { ZhaoMuGameType } from "../../MeiNvZhaoMu/MeiNvZhaoMuManager"


enum MaJiangType{
    // CaiNiaoJu=0,//菜鸟局
    // RuMenJu,//入门局
    GaoShouJu,//高手局
}
//1~9万 11~19筒 21~29条 51~57东南西北中发白
let MaJiangInitConfig = [
    // {gameType:MaJiangType.CaiNiaoJu,shouYi:8000,jiangLi:80000,zhuangXiuFei:2000000,line:8,col:6,contentScale:1,typeData:[1,2,3,4,5,6,7,8,9,11,12,13]},
    // {gameType:MaJiangType.RuMenJu,shouYi:12000,jiangLi:500000,zhuangXiuFei:6000000,line:10,col:8,contentScale:1,typeData:[1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,55,56]},
    {gameType:MaJiangType.GaoShouJu,shouYi:16000,jiangLi:1000000,zhuangXiuFei:30000000,line:12,col:10,contentScale:0.8,typeData:[1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,55,56,57]},
]
export enum MoveDir{
    None=0,
    Up,
    Down,
    Left,
    Right
}
export default class YiMaJiangManager{
    public static initAllData(){
        this.maJiangDataArr = []
        this.moveTempMjDataArr = []
        this.curMoveStep = -1
    }
    public static singleMjWidth = 74
    public static singleMjHeight = 82

    public static maJiangDataArr = []//全部麻将数据
    public static moveTempMjDataArr = []//移动时临时的全部麻将数据
    public static curMoveStep = -1//记录当前移动步骤(移动时有变动才刷新data)

    public static curGameType = 0
    public static setCurGameType(type){
        this.curGameType = type
    }
    public static getCurGameType(){
        return this.curGameType
    }

    public static touchStartInitData(){
        this.moveTempMjDataArr = []
        this.curMoveStep = -1
    }
    public static getCurMoveStep(){
        return this.curMoveStep
    }
    public static getMjConfig(){
        return MaJiangInitConfig[this.curGameType]
    }
    public static getAllMjConfig(){
        return MaJiangInitConfig
    }
    public static setMaJiangInitData(){
        this.initAllData()

        let typeData = MaJiangInitConfig[this.curGameType].typeData
        let tempDataArr = []
        for(let i=0;i<typeData.length;i++){
            for(let j=0;j<4;j++){
                tempDataArr.push(typeData[i])
            }
        }
        tempDataArr = Common5.shuffle(tempDataArr)
        

        let line = MaJiangInitConfig[this.curGameType].line
        let col = MaJiangInitConfig[this.curGameType].col
        for(let i=0;i<line;i++){
            this.maJiangDataArr[i] = []
            for(let j=0;j<col;j++){
                let num = tempDataArr.pop()
                if(num){
                    this.maJiangDataArr[i].push(num)
                }else{
                    this.maJiangDataArr[i].push(0)
                }
            }
        }
        console.log('获取麻将数据',this.maJiangDataArr)
    }
    public static getMaJiangData(){
        return this.maJiangDataArr
    }
    public static getMoveEndTempMJData(){
        return this.moveTempMjDataArr
    }
    public static setMjDataToTempData(){
        this.maJiangDataArr = this.moveTempMjDataArr
        this.moveTempMjDataArr = []
    }
    //检测点击是否可以直接消除
    public static checkClickIsCanClearUp(posX,posY){
        let mjData = this.maJiangDataArr[posX][posY]
        if(mjData == 0){
            return null
        }

        return this.checkIsCanXiaoChu(posX,posY,mjData,this.maJiangDataArr)
    }
    //检测是否可以直接消除
    public static checkIsCanXiaoChu(posX,posY,mjData,maJiangDataArr){
        let line = MaJiangInitConfig[this.curGameType].line
        let col = MaJiangInitConfig[this.curGameType].col

        /*****同行检测*****/
        //向左找
        for(let j=posY-1;j>=0;j--){
            if(maJiangDataArr[posX][j] == 0 ){
                continue
            }else if(maJiangDataArr[posX][j] == mjData){
                return {posX:posX,posY:j}
            }else{
                break
            }
        }
        //向右找
        for(let j=posY+1;j<col;j++){
            if(maJiangDataArr[posX][j] == 0 ){
                continue
            }else if(maJiangDataArr[posX][j] == mjData){
                return {posX:posX,posY:j}
            }else{
                break
            }
        }

        /*****同列检测*****/
        //向上找
        for(let i=posX-1;i>=0;i--){
            if(maJiangDataArr[i][posY] == 0 ){
                continue
            }else if(maJiangDataArr[i][posY] == mjData){
                return {posX:i,posY:posY}
            }else{
                break
            }
        }
        //向下找
        for(let i=posX+1;i<line;i++){
            if(maJiangDataArr[i][posY] == 0 ){
                continue
            }else if(maJiangDataArr[i][posY] == mjData){
                return {posX:i,posY:posY}
            }else{
                break
            }
        }
        return null
    }
    //消除两个麻将
    public static clearUpTwoMJ(mj1,mj2){
        this.maJiangDataArr[mj1.posX][mj1.posY] = 0
        this.maJiangDataArr[mj2.posX][mj2.posY] = 0

        console.log('消除后最新麻将数据==',this.maJiangDataArr)
    }
    //检测成功
    public static checkIsSuccess(){
        let line = MaJiangInitConfig[this.curGameType].line
        let col = MaJiangInitConfig[this.curGameType].col
        for(let i=0;i<line;i++){
            for(let j=0;j<col;j++){
                //有未消除的即为未结束
                if(this.maJiangDataArr[i][j] != 0){
                    return false
                }
            }
        }
        return true
    }

    //根据选择的麻将和方向获取可以移动的麻将数据
    public static getCanMoveMJByDir(dir,mjPosData){
        let posX = mjPosData.posX
        let posY = mjPosData.posY

        // console.log('移动的麻将==',mjPosData)
        let line = MaJiangInitConfig[this.curGameType].line
        let col = MaJiangInitConfig[this.curGameType].col

        let canMoveMjData = []//可移动的麻将数据
        let maxMoveStep = 0//最大可移动步数
        let isFindKongGe = false//是否发现空格(这时候可移动麻将数量停止运算)
        let isReFindMj = false//是否重新发现麻将(这时候空格数计算中断)
        
        //往上
        if(dir == MoveDir.Up){
            for(let i=posX;i>=0;i--){
                if(this.maJiangDataArr[i][posY] != 0 ){
                    if(!isFindKongGe){
                        canMoveMjData.push({posX:i,posY:posY})
                    }else{
                        isReFindMj = true
                    }
                }else{
                    isFindKongGe = true
                    if(!isReFindMj){
                        maxMoveStep++
                    }
                }
            }
        //往下
        }else if(dir == MoveDir.Down){
            for(let i=posX;i<line;i++){
                if(this.maJiangDataArr[i][posY] != 0 ){
                    if(!isFindKongGe){
                        canMoveMjData.push({posX:i,posY:posY})
                    }else{
                        isReFindMj = true
                    }
                }else{
                    isFindKongGe = true
                    if(!isReFindMj){
                        maxMoveStep++
                    }
                }
            }
        //往左
        }else if(dir == MoveDir.Left){
            for(let j=posY;j>=0;j--){
                if(this.maJiangDataArr[posX][j] != 0 ){
                    if(!isFindKongGe){
                        canMoveMjData.push({posX:posX,posY:j})
                    }else{
                        isReFindMj = true
                    }
                }else{
                    isFindKongGe = true
                    if(!isReFindMj){
                        maxMoveStep++
                    }
                }
            }
        //往右
        }else if(dir == MoveDir.Right){
            for(let j=posY;j<col;j++){
                if(this.maJiangDataArr[posX][j] != 0 ){
                    if(!isFindKongGe){
                        canMoveMjData.push({posX:posX,posY:j})
                    }else{
                        isReFindMj = true
                    }
                }else{
                    isFindKongGe = true
                    if(!isReFindMj){
                        maxMoveStep++
                    }
                }
            }
        }
        
        let result = {canMoveMjData:canMoveMjData,maxMoveStep:maxMoveStep}
        // console.log('可以移动的麻将数据==',result)
        return result
    }
    //设置移动时临时的麻将数据
    public static setMoveTempMjData(dir,canMoveMjData,moveStep,isNeedCheckStep){
        if(isNeedCheckStep && moveStep == this.curMoveStep){
            return
        }
        this.curMoveStep = moveStep

        //先将麻将数据都拷贝给临时数据
        this.moveTempMjDataArr = Common5.deepClone(this.maJiangDataArr)
        //先将需要移动的部分全部置空
        for(let i=0;i<canMoveMjData.length;i++){
            this.moveTempMjDataArr[canMoveMjData[i].posX][canMoveMjData[i].posY] = 0
        }

        //移动麻将
        for(let i=0;i<canMoveMjData.length;i++){
            let posX = 0
            let posY = 0
            if(dir == MoveDir.Up){
                posX = canMoveMjData[i].posX - moveStep
                posY = canMoveMjData[i].posY 

            }else if(dir == MoveDir.Down){
                posX = canMoveMjData[i].posX + moveStep
                posY = canMoveMjData[i].posY 

            }else if(dir == MoveDir.Left){
                posX = canMoveMjData[i].posX 
                posY = canMoveMjData[i].posY - moveStep

            }else if(dir == MoveDir.Right){
                posX = canMoveMjData[i].posX 
                posY = canMoveMjData[i].posY + moveStep

            }
            
            this.moveTempMjDataArr[posX][posY] = this.maJiangDataArr[canMoveMjData[i].posX][canMoveMjData[i].posY]
        }
        console.log('当前临时麻将数据==',this.moveTempMjDataArr)
    }
    //移动停止,检测可消除麻将
    public static moveEndCheckXiaoChu(dir,canMoveMjData,moveStep,mjPosData){
        if(moveStep == 0){
            return null
        }
        let myPosData = this.getCurClickCardPosData(dir,mjPosData,moveStep)
        

        let mjData = this.moveTempMjDataArr[myPosData.posX][myPosData.posY]

        let mj2 = this.checkIsCanXiaoChu(myPosData.posX,myPosData.posY,mjData,this.moveTempMjDataArr)
        return {mj1:myPosData,mj2:mj2}
    }
    public static getCurClickCardPosData(dir,mjPosData,moveStep){
        let myPosData = {posX:mjPosData.posX,posY:mjPosData.posY}
        
        if(dir == MoveDir.Up){
            myPosData.posX = mjPosData.posX - moveStep
        }else if(dir == MoveDir.Down){
            myPosData.posX = mjPosData.posX + moveStep
        }else if(dir == MoveDir.Left){
            myPosData.posY = mjPosData.posY - moveStep
        }else if(dir == MoveDir.Right){
            myPosData.posY = mjPosData.posY + moveStep
        }
        return myPosData
    }
    //比较临时牌与正常牌差异,差异的即为需要移动的牌
    public static compareTempMjData(){
        let tab = []
        let line = MaJiangInitConfig[this.curGameType].line
        let col = MaJiangInitConfig[this.curGameType].col
        for(let i=0;i<line;i++){
            for(let j=0;j<col;j++){
                if(this.maJiangDataArr[i][j] != this.moveTempMjDataArr[i][j] && this.maJiangDataArr[i][j] == 0 ){
                    let posData = {posX:i,posY:j}
                    tab.push(posData)
                }
            }
        }
        return tab
    }

    //重新洗牌
    public static chongXinXiPai(){
        let tempArr = []
        let line = MaJiangInitConfig[this.curGameType].line
        let col = MaJiangInitConfig[this.curGameType].col
        //先取出不为空的数据
        for(let i=0;i<line;i++){
            for(let j=0;j<col;j++){
                if(this.maJiangDataArr[i][j] != 0){
                    tempArr.push(this.maJiangDataArr[i][j])
                }
            }
        }
        tempArr = Common5.shuffle(tempArr)
        //重新打乱顺序赋值
        for(let i=0;i<line;i++){
            for(let j=0;j<col;j++){
                if(this.maJiangDataArr[i][j] != 0){
                    this.maJiangDataArr[i][j] = tempArr.pop()
                }
            }
        }
        console.log('重新洗牌后数据==',this.maJiangDataArr)
    }
    //获取提示数据
    public static getTiShiMjData(){
        /********首先检测直接点击是否可以消除********/
        let line = MaJiangInitConfig[this.curGameType].line
        let col = MaJiangInitConfig[this.curGameType].col
        
        for(let i=0;i<line;i++){
            for(let j=0;j<col;j++){
                if(this.maJiangDataArr[i][j] != 0){
                    let mj2 = this.checkClickIsCanClearUp(i,j)
                    if(mj2){
                        let mj1 = {posX:i,posY:j}
                        console.log('11111提示麻将数据==',mj1,mj2)
                        return {mj1:mj1,mj2:mj2}
                    }
                }
            }
        }

        /********检测每个麻将上下左右移动n步数可否消除********/
        for(let i=0;i<line;i++){
            for(let j=0;j<col;j++){
                if(this.maJiangDataArr[i][j] != 0){
                    let mjPosData = {posX:i,posY:j}
                    let startDir = MoveDir.Up
                    let endDir = MoveDir.Right
                    //遍历上下左右四个方向
                    for(let dir=startDir;dir<=endDir;dir++){
                        let canMoveMJInfo = YiMaJiangManager.getCanMoveMJByDir(dir,mjPosData)
                        if(!canMoveMJInfo){
                            continue
                        }
                        let canMoveMjData = canMoveMJInfo.canMoveMjData
                        let maxMoveStep = canMoveMJInfo.maxMoveStep
                        if(maxMoveStep <= 0){
                            continue
                        }
                        //遍历每移动步数
                        for(let moveStep =1;moveStep<=maxMoveStep;moveStep++){
                            YiMaJiangManager.setMoveTempMjData(dir,canMoveMjData,moveStep,false)
                            let result = YiMaJiangManager.moveEndCheckXiaoChu(dir,canMoveMjData,moveStep,mjPosData)
                            //可消除,直接停在当前位置
                            if(result && result.mj2){
                                result.mj1 = mjPosData
                                console.log('22222提示麻将数据==',result)
                                
                                return result
                            }
                        }
                    }
                }
            }
        }
        return null
    }

    public static setYiMaJiangLockArray(id,isUnLock){
        User.setYiMaJiangLockArray(MaJiangInitConfig.length,id,isUnLock)
    }
    public static getYiMaJiangLockArray(){
        return User.getYiMaJiangLockArray(MaJiangInitConfig.length)
    }

    // //每秒收益
    // public static getYiMaJiangPerSecondMoney(){
    //     let zongShouYi = 0
    //     let localZhaoMuData = MeiNvZhaoMuManager.getMeiNvZhaoMuData() 
    //     let zhaoMuBeiShu = localZhaoMuData[ZhaoMuGameType.YiMaJiang].zhaoMuBeiShu
    //     let localInfo = this.getYiMaJiangLockArray()
    //     let mjConfig = this.getAllMjConfig()
    //     for(let i=0;i<mjConfig.length;i++){
    //         //已解锁
    //         if(localInfo[i]){
    //             let shouYi = mjConfig[i].shouYi * zhaoMuBeiShu
    //             zongShouYi += shouYi
    //         //未解锁
    //         }else{
                
    //         }
    //     }
    //     return zongShouYi
    // }
}