import { ryw_Event } from "../../../FrameWork/Event/EventEnum";
import EventMgr from "../../../FrameWork/Event/EventMgr";
import User from "../../../FrameWork/User/User";
import AppPlatform from "../../../FrameWork/Util/AppPlatform";
import Common5 from "../../../Platform/th/Common5";
import TaskManager, { MainTaskIdEnum } from "../../JuQingChat/TaskManager";
import LevelUpManager from "../../Manager/LevelUpManager";
import UserManager from "../../Manager/UserManager";
import PrefabManage, { GameType } from "../../PrefabManager/PrefabManage";
import SingleMaJiang from "./SingleMaJiang";
import YiMaJiangManager, { MoveDir } from "./YiMaJiangManager";
import YiMaJiangResult from "./YiMaJiangResult";


const { ccclass, property } = cc._decorator;

@ccclass
export default class YiMaJiang extends cc.Component {

    @property(cc.Prefab)
    singleMjPrefab: cc.Prefab = null;

    @property(cc.Node)
    contentNode: cc.Node = null;

    @property(cc.Node)
    tipBtn: cc.Node = null;

    @property(cc.Node)
    tipBtnAd: cc.Node = null;

    @property(cc.Node)
    wanFaYanShi: cc.Node = null;

    cardNodeList = []
    canMoveMJInfo = null
    curMoveStep = -1

    cardPositionList = []
    isXiaoChuAction = false//正在消牌中,不能操作
    // cardZIndex:number = 100
    public static _instance = null
    leftFreeTipNum: number = 2
    onLoad() {
        YiMaJiang._instance = this

        EventMgr.onEvent_custom(ryw_Event.XiaoChuMJ, (mj1, mj2) => {
            this.clearUpTwoMJ(mj1, mj2);
        }, this);

        EventMgr.onEvent_custom(ryw_Event.MoveMJ, (dir, moveStep, mjPosData, disData, canMoveMJInfo) => {
            this.moveAllTiled(dir, moveStep, mjPosData, disData, canMoveMJInfo);
        }, this);


    }

    start() {

    }
    initView(type) {
        YiMaJiangManager.setCurGameType(type)
        YiMaJiangManager.setMaJiangInitData()
        this.refreshView()
        this.refreshTipNum()
    }
    refreshTipNum() {
        if (this.leftFreeTipNum <= 0) {
            this.tipBtn.active = false
            this.tipBtnAd.active = true
        } else {
            this.tipBtn.active = true
            this.tipBtnAd.active = false
        }
        this.tipBtn.getChildByName('leftNum').getComponent(cc.Label).string = '' + this.leftFreeTipNum
    }
    public static getInstance() {
        return YiMaJiang._instance
    }
    setIsXiaoChuAction(bTrue) {
        this.isXiaoChuAction = bTrue
    }
    getIsXiaoChuAction() {
        return this.isXiaoChuAction
    }
    setCanMoveMJInfo(tab) {
        this.canMoveMJInfo = tab
    }
    getCanMoveMJInfo() {
        return this.canMoveMJInfo
    }

    refreshView() {
        this.contentNode.removeAllChildren()
        let mjData = YiMaJiangManager.getMaJiangData()
        for (let i = 0; i < mjData.length; i++) {
            this.cardNodeList[i] = []
            this.cardPositionList[i] = []
            for (let j = 0; j < mjData[i].length; j++) {
                let mj = cc.instantiate(this.singleMjPrefab)
                mj.getComponent(SingleMaJiang).initCard(i, j, mjData[i][j])
                mj.active = true
                mj.parent = this.contentNode
                this.cardNodeList[i][j] = mj

                let _x = mj.getComponent(SingleMaJiang).getCardX()
                let _y = mj.getComponent(SingleMaJiang).getCardY()
                this.cardPositionList[i][j] = { x: _x, y: _y }
            }
        }
        let mjConfig = YiMaJiangManager.getMjConfig()
        this.contentNode.width = YiMaJiangManager.singleMjWidth * mjData[0].length + 30
        this.contentNode.height = YiMaJiangManager.singleMjHeight * mjData.length + 30
        this.contentNode.scale = mjConfig.contentScale
    }
    clearTipIcon() {
        let mjData = YiMaJiangManager.getMaJiangData()
        for (let i = 0; i < mjData.length; i++) {

            for (let j = 0; j < mjData[i].length; j++) {
                this.cardNodeList[i][j].getComponent(SingleMaJiang).showTipIcon(false)
            }
        }
    }
    //清除两个麻将
    clearUpTwoMJ(mj1, mj2) {
        YiMaJiangManager.clearUpTwoMJ(mj1, mj2)
        this.cardNodeList[mj1.posX][mj1.posY].getComponent(SingleMaJiang).turnAroundCard(mj1.posX, mj1.posY, 0)
        this.cardNodeList[mj2.posX][mj2.posY].getComponent(SingleMaJiang).turnAroundCard(mj2.posX, mj2.posY, 0)
        this.clearTipIcon()

        this.checkResult()
    }

    //移动麻将
    moveAllTiled(dir, moveStep, mjPosData, disData, canMoveMJInfo) {
        // console.log('移动麻将==',mjData,disData,canMoveMJInfo)
        if (!canMoveMJInfo) {
            return
        }
        let canMoveMjData = canMoveMJInfo.canMoveMjData
        let maxMoveStep = canMoveMJInfo.maxMoveStep
        if (maxMoveStep <= 0) {
            return
        }
        for (let i = 0; i < canMoveMjData.length; i++) {
            let _x = this.cardNodeList[canMoveMjData[i].posX][canMoveMjData[i].posY].getComponent(SingleMaJiang).getCardX()
            let _y = this.cardNodeList[canMoveMjData[i].posX][canMoveMjData[i].posY].getComponent(SingleMaJiang).getCardY()
            this.cardNodeList[canMoveMjData[i].posX][canMoveMjData[i].posY].x = _x + disData.disX
            this.cardNodeList[canMoveMjData[i].posX][canMoveMjData[i].posY].y = _y + disData.disY
            this.cardNodeList[canMoveMjData[i].posX][canMoveMjData[i].posY].zIndex = 200
        }

        if (moveStep == this.curMoveStep) {
            return
        }
        // let trueDir = dir
        // if(dir == MoveDir.Up){
        //     if(moveStep < this.curMoveStep){
        //         trueDir = MoveDir.Down
        //     }
        // }else if(dir == MoveDir.Down){
        //     if(moveStep < this.curMoveStep){
        //         trueDir = MoveDir.Up
        //     }
        // }else if(dir == MoveDir.Left){
        //     if(moveStep < this.curMoveStep){
        //         trueDir = MoveDir.Right
        //     }

        // }else if(dir == MoveDir.Right){
        //     if(moveStep < this.curMoveStep){
        //         trueDir = MoveDir.Left
        //     }
        // }



        let clickCurPos = YiMaJiangManager.getCurClickCardPosData(dir, mjPosData, moveStep)

        console.log('moveStep,clickCurPos==', moveStep, clickCurPos)
        let moveStartPosX = clickCurPos.posX
        let moveStartPosY = clickCurPos.posY

        let moveEndPosX = clickCurPos.posX
        let moveEndPosY = clickCurPos.posY
        if (this.curMoveStep >= 0) {
            if (dir == MoveDir.Up) {
                moveStartPosX = clickCurPos.posX - canMoveMjData.length + 1
                moveStartPosY = clickCurPos.posY

                moveEndPosX = clickCurPos.posX + 1
                moveEndPosY = clickCurPos.posY

            } else if (dir == MoveDir.Down) {
                moveStartPosX = clickCurPos.posX + canMoveMjData.length - 1
                moveStartPosY = clickCurPos.posY

                moveEndPosX = clickCurPos.posX - 1
                moveEndPosY = clickCurPos.posY
            } else if (dir == MoveDir.Left) {
                moveStartPosX = clickCurPos.posX
                moveStartPosY = clickCurPos.posY - canMoveMjData.length + 1

                moveEndPosX = clickCurPos.posX
                moveEndPosY = clickCurPos.posY + 1

            } else if (dir == MoveDir.Right) {
                moveStartPosX = clickCurPos.posX
                moveStartPosY = clickCurPos.posY + canMoveMjData.length - 1

                moveEndPosX = clickCurPos.posX
                moveEndPosY = clickCurPos.posY - 1
            }

            if (moveStep < this.curMoveStep) {
                if (dir == MoveDir.Up) {
                    moveStartPosX = clickCurPos.posX - canMoveMjData.length
                    moveStartPosY = clickCurPos.posY

                } else if (dir == MoveDir.Down) {
                    moveStartPosX = clickCurPos.posX + canMoveMjData.length
                    moveStartPosY = clickCurPos.posY
                } else if (dir == MoveDir.Left) {
                    moveStartPosX = clickCurPos.posX
                    moveStartPosY = clickCurPos.posY - canMoveMjData.length

                } else if (dir == MoveDir.Right) {
                    moveStartPosX = clickCurPos.posX
                    moveStartPosY = clickCurPos.posY + canMoveMjData.length
                }

                let node = this.cardNodeList[moveStartPosX][moveStartPosY]
                let _x = node.getComponent(SingleMaJiang).getCardX()
                let _y = node.getComponent(SingleMaJiang).getCardY()
                cc.tween(node)
                    .to(0.2, { x: _x, y: _y })
                    .start()
            } else {
                let node = this.cardNodeList[moveStartPosX][moveStartPosY]
                // let positionX = this.cardNodeList[moveEndPosX][moveEndPosY].getComponent(SingleMaJiang).getCardX()
                // let positionY = this.cardNodeList[moveEndPosX][moveEndPosY].getComponent(SingleMaJiang).getCardY()
                node.stopAllActions()
                cc.tween(node)
                    .to(0.2, { x: this.cardPositionList[moveEndPosX][moveEndPosY].x, y: this.cardPositionList[moveEndPosX][moveEndPosY].y })
                    .start()
            }

            // console.log('初始位置==',node.x,node.y)
            // console.log('结束位置==',node.x,node.y)
        }
        this.curMoveStep = moveStep

        console.log('moveStartPosX,moveStartPosY==', moveStartPosX, moveStartPosY)
        console.log('moveEndPosX,moveEndPosY==', moveEndPosX, moveEndPosY)
    }

    //麻将回到初始位置
    moveToOriginPos() {
        this.curMoveStep = -1
        let mjData = YiMaJiangManager.getMaJiangData()
        for (let i = 0; i < mjData.length; i++) {
            for (let j = 0; j < mjData[i].length; j++) {
                this.cardNodeList[i][j].getComponent(SingleMaJiang).initCard(i, j, mjData[i][j])
            }
        }
    }
    //麻将固定位置
    moveToFixedPos(mj1, mj2) {
        this.curMoveStep = -1
        let tempData = YiMaJiangManager.getMoveEndTempMJData()
        for (let i = 0; i < tempData.length; i++) {
            for (let j = 0; j < tempData[i].length; j++) {
                this.cardNodeList[i][j].getComponent(SingleMaJiang).initCard(i, j, tempData[i][j])
            }
        }
        YiMaJiangManager.setMjDataToTempData()
        this.clearUpTwoMJ(mj1, mj2);
        // EventMgr.emitEvent_custom(ryw_Event.XiaoChuMJ,mj1,mj2 )
    }

    onBtnClickXiPai() {
        let tab = {
            onClose: (finish) => {
                if (finish) {
                    User.setShowAdNum(User.getShowAdNum() + 1)
                    Common5.ReportDY("inLevel", `任务${TaskManager.getCurUnLockMainTaskId()}-AD-移麻将洗牌`)
                    // Common5.ReportDY("inLevel", '移麻将-AD-洗牌');

                    YiMaJiangManager.chongXinXiPai()
                    this.refreshView()
                }
                else {

                    Common5.showTips_custom("广告未观看完");
                }
            },
            onFailed: () => { }
        }
        AppPlatform.playVideo_custom(tab);
    }
    onBtnClickTiShi() {
        this.leftFreeTipNum--
        this.refreshTipNum()
        this.tipCallFunc()
    }
    onBtnClickTiShiAD() {
        let tab = {
            onClose: (finish) => {
                if (finish) {
                    User.setShowAdNum(User.getShowAdNum() + 1)
                    Common5.ReportDY("inLevel", `任务${TaskManager.getCurUnLockMainTaskId()}-AD-移麻将提示`)
                    // Common5.ReportDY("inLevel", '移麻将-AD-提示');
                    this.tipCallFunc()
                }
                else {

                    Common5.showTips_custom("广告未观看完");
                }
            },
            onFailed: () => { }
        }
        AppPlatform.playVideo_custom(tab);
    }
    tipCallFunc() {
        let result = YiMaJiangManager.getTiShiMjData()
        if (result) {
            let mj1 = result.mj1
            let mj2 = result.mj2
            this.cardNodeList[mj1.posX][mj1.posY].getComponent(SingleMaJiang).showTipIcon(true)
            this.cardNodeList[mj2.posX][mj2.posY].getComponent(SingleMaJiang).showTipIcon(true)
        }
    }
    checkResult() {
        if (YiMaJiangManager.checkIsSuccess()) {
            this.showResultSuccess()
        } else {
            let result = YiMaJiangManager.getTiShiMjData()
            if (result) {

            } else {
                this.showResultFail()
            }
        }
    }
    showResultSuccess() {
        this.scheduleOnce(() => {
            // TaskManager.finishCurMainTask(MainTaskIdEnum.MainTask_2501);
            // TaskManager.setCurUnLockMainTaskInfo(MainTaskIdEnum.MainTask_2502);
            UserManager.addMoney(LevelUpManager.levelUpSpned() * 10)
            EventMgr.emitEvent_custom(ryw_Event.RefreshJuQingDuiHua);
            this.node.removeFromParent();
            this.node.destroy();
        }, 2);
        return;
        let mjConfig = YiMaJiangManager.getMjConfig()
        let lingQuCallFunc = () => {
            UserManager.addMoney(mjConfig.jiangLi)
            this.node.removeFromParent()
        }
        let shuangBeiLingQuCallFunc = () => {
            UserManager.addMoney(mjConfig.jiangLi * 2)
            this.node.removeFromParent()
        }
        PrefabManage.loadPrefabByType(GameType.YiMaJiangResult, null, (prefabNode) => {
            prefabNode.getComponent(YiMaJiangResult).initView('success', lingQuCallFunc, shuangBeiLingQuCallFunc)
        })
    }
    showResultFail() {
        let restartCallFunc = () => {
            let type = YiMaJiangManager.getCurGameType()
            this.initView(type)
        }
        let fuHuoCallFunc = () => {
            YiMaJiangManager.chongXinXiPai()
            let result = YiMaJiangManager.getTiShiMjData()
            if (result) {
            } else {
                YiMaJiangManager.chongXinXiPai()
            }
            this.refreshView()
        }
        PrefabManage.loadPrefabByType(GameType.YiMaJiangResult, null, (prefabNode) => {
            prefabNode.getComponent(YiMaJiangResult).initView('fail', restartCallFunc, fuHuoCallFunc)
        })
    }
    onOpenWanFaYanShi() {
        this.wanFaYanShi.active = true
    }
    onCloseWanFaYanShi() {
        this.wanFaYanShi.active = false
    }
}