import User from "../../FrameWork/User/User";
import Common5 from "../../Platform/th/Common5";
import BagManager from "./BagManager";
import InterfaceManager from "./InterfaceManager";
import ShipuManager from "./ShipuManager";
import TanWeiManager from "./TanWeiManager";
enum PINGZHI {
    lock,
    gray,
    green,
    blue,
    purple,
    orange,
    color
}
type WUPINGGAILV = {
    level: number,
    tanwei: number,
    miandian: number,
    zhuzi: number,
}
type PINGZHIGAILV = {
    level: number,
    green: number,
    blue: number,
    purple: number,
    orange: number,
    color: number,
}
let wuPingGaiLv: WUPINGGAILV[] = [
    { level: 100, tanwei: 30, miandian: 60, zhuzi: 10 },
    { level: 200, tanwei: 30, miandian: 60, zhuzi: 10 },
    { level: 300, tanwei: 30, miandian: 60, zhuzi: 10 },
    { level: 600, tanwei: 30, miandian: 60, zhuzi: 10 },
    { level: 900, tanwei: 30, miandian: 60, zhuzi: 10 },
    { level: 1200, tanwei: 25, miandian: 65, zhuzi: 10 },
    { level: 1500, tanwei: 20, miandian: 70, zhuzi: 10 },
]

let pingZhiGaiLv: PINGZHIGAILV[] = [
    { level: 100, green: 80, blue: 20, purple: 0, orange: 0, color: 0 },
    { level: 200, green: 70, blue: 20, purple: 10, orange: 0, color: 0 },
    { level: 300, green: 60, blue: 30, purple: 10, orange: 0, color: 0 },
    { level: 600, green: 60, blue: 20, purple: 10, orange: 10, color: 0 },
    { level: 900, green: 50, blue: 10, purple: 20, orange: 10, color: 10 },
    { level: 1200, green: 50, blue: 10, purple: 10, orange: 20, color: 10 },
]

let zhuzis = [3730, 3731, 3732, 3733, 3734, 3735, 3736]

export default class DiaoLuoManager {

    public static getDiaoLuo() {
        //掉落(根据等级选择概率,先根据物品掉落概率随机物品,再根据品质概率随机物品的品质,检查自身当前品质,随机的物品品质必须必自身当前品质高,如果自身当前等级对应的物品品质都到顶了,就不再掉落)
        // let shiPuArray = User.getShiPuArray()
        // let tanWeiArray = User.getTanweiArray()
        // let otherArray = [3730, 3731, 3732, 3733, 3734, 3735, 3736] //珠子

        let level = User.getMyLevel()


        //随机物品
        if (level >= wuPingGaiLv[0].level) {
            let gailv = this.getWuPingGaiLvByMyLevel()
            let gailv_pingzhi = this.getPingZhiGaiLvByMyLevel()
            let wuping = this.getWuPingByGaiLv(gailv)
            let pingzhi = this.getPingZhiByGaiLv(gailv_pingzhi, wuping)
            return { wuping: wuping, pingzhi: pingzhi }
        }
    }

    public static getDiaoLuoArray(num) {
        //掉落(根据等级选择概率,先根据物品掉落概率随机物品,再根据品质概率随机物品的品质,检查自身当前品质,随机的物品品质必须必自身当前品质高,如果自身当前等级对应的物品品质都到顶了,就不再掉落)
        // let shiPuArray = User.getShiPuArray()
        // let tanWeiArray = User.getTanweiArray()
        // let otherArray = [3730, 3731, 3732, 3733, 3734, 3735, 3736] //珠子

        let level = User.getMyLevel()


        //随机多个物品
        let arr = []
        let curRandom = 0
        let maxRandom = 10
        if (level >= wuPingGaiLv[0].level) {
            while (arr.length < num) {
                let diaoluo = this.getDiaoLuo()
                if (arr.length == 0) {
                    arr.push(diaoluo)
                } else {
                    let isHave = false
                    for (let j = 0; j < arr.length; j++) {
                        if (arr[j].wuping == diaoluo.wuping) {
                            isHave = true
                            break
                        }
                    }
                    if (!isHave) {
                        arr.push(diaoluo)
                    } else {
                        curRandom++
                        if (curRandom >= maxRandom) {
                            break
                        }
                    }
                }
            }
        }

        for (let i = arr.length - 1; i >= 0; i--) {
            if (!arr[i].wuping || !arr[i].pingzhi) {
                arr.splice(i, 1);
            }
        }

        //第一次掉落,必定出一个橙色和珠子
        if (User.getShouCiDiaoLuo() == 1) {
            User.setShouCiDiaoLuo(-1)
            let isHaveOrange = false
            let index1
            let index2
            for (let i = 0; i < arr.length; i++) {
                if (arr[i].wuping && arr[i].pingzhi) {
                    if (typeof arr[i].wuping != "number") {
                        if (arr[i].pingzhi >= PINGZHI.orange) {
                            isHaveOrange = true
                            index1 = i
                        } else {
                            index1 = i
                        }
                    } else {
                        index2 = i
                    }
                }
            }
            if (!isHaveOrange) {
                if (index1 != null && index1 != undefined) {
                    arr[index1].pingzhi = PINGZHI.orange
                }
            }
            //第一个橙色物品不需要广告
            arr[index1].isNotAd = true

            let isHaveZhuZi = false
            for (let i = 0; i < arr.length; i++) {
                if (arr[i].wuping && arr[i].pingzhi) {
                    if (zhuzis.includes(arr[i].wuping)) {
                        isHaveZhuZi = true
                        break
                    }
                }
            }
            if (!isHaveZhuZi) {
                if (index2 != null && index2 != undefined) {
                    arr[index2].wuping = zhuzis[this.getRandomInt(0, zhuzis.length - 1)]
                    arr[index2].pingzhi = this.getZhuZiPingZhi()
                }else{
                    arr[0].wuping = zhuzis[this.getRandomInt(0, zhuzis.length - 1)]
                    arr[0].pingzhi = this.getZhuZiPingZhi()
                }
            }
        }
        return arr
    }

    public static getWuPingByGaiLv(_gailv: WUPINGGAILV) {
        let gailv = Common5.deepClone(_gailv)
        let shiPuArray = User.getShiPuArray()
        let tanWeiArray = User.getTanweiArray()
        let otherArray = zhuzis //珠子
        let num = this.getRandomInt(1, 100)
        let gailv_pingzhi = this.getPingZhiGaiLvByMyLevel()
        let pingzhi = ["", "", "green", "blue", "purple", "orange", "color"]
        //已经解锁的面点并且等级
        let shiPuUnlocks = []
        let maxLevel = 6
        for (let i = 0; i < shiPuArray.length; i++) {
            if (!shiPuArray[i].isLock && shiPuArray[i].level < maxLevel && gailv_pingzhi[pingzhi[shiPuArray[i].level + 1]] > 0) {
                shiPuUnlocks.push(shiPuArray[i])
            }
        }
        //已经解锁的摊位
        let tanWeiUnlocks = []
        for (let i = 0; i < tanWeiArray.length; i++) {
            if (!tanWeiArray[i].isLock && tanWeiArray[i].level < maxLevel && gailv_pingzhi[pingzhi[tanWeiArray[i].level + 1]] > 0) {
                tanWeiUnlocks.push(tanWeiArray[i])
            }
        }
        //动态调整概率,没有解锁的不参与
        if (shiPuUnlocks.length == 0 && tanWeiUnlocks.length == 0) {
            let isFindAll = true
            for (let i = 0; i < zhuzis.length; i++) {
                if (BagManager.getBagGoodNums(zhuzis[i]) <= 0) {
                    isFindAll = false
                    break
                }
            }
            if (!isFindAll) {
                //必定出珠子
                gailv.tanwei = 0
                gailv.miandian = 0
                gailv.zhuzi = 100
            } else {
                gailv.tanwei = 0
                gailv.miandian = 0
                gailv.zhuzi = 0
            }
        } else if (shiPuUnlocks.length == 0 && tanWeiUnlocks.length != 0) {
            gailv.tanwei += gailv.miandian
            gailv.miandian = 0
        } else if (shiPuUnlocks.length != 0 && tanWeiUnlocks.length == 0) {
            gailv.miandian += gailv.tanwei
            gailv.tanwei = 0
        } else {
            // gailv.miandian = gailv.tanwei + gailv.miandian
            // gailv.zhuzi = gailv.miandian + gailv.zhuzi
        }
        let wuping
        if (num > 0 && num <= gailv.tanwei) {
            wuping = tanWeiUnlocks[this.getRandomInt(0, tanWeiUnlocks.length - 1)]
        } else if (num > gailv.tanwei && num <= gailv.miandian) {
            wuping = shiPuUnlocks[this.getRandomInt(0, shiPuUnlocks.length - 1)]
            wuping.isShiPu = true
        } else if (num > gailv.miandian && num <= gailv.zhuzi) {
            wuping = otherArray[this.getRandomInt(0, otherArray.length - 1)]
            if (BagManager.getBagGoodNums(wuping) > 0) {
                wuping = null
            }
        }
        return wuping
    }

    public static getPingZhiByGaiLv(_gailv: PINGZHIGAILV, wuping) {
        let num = this.getRandomInt(1, 100)
        let gailv = Common5.deepClone(_gailv)
        let config
        if (typeof (wuping) == "number") {
            return this.getZhuZiPingZhi()
        } else {
            config = wuping
            // if (wuping.isShiPu) {
            //     config = ShipuManager.getShipuConfigDate(wuping.id)
            // }else{
            //     config = TanWeiManager.getShipuConfigDate(wuping.id)
            // }

            let _green = gailv.green
            if (gailv.green != 0) {
                if (config && config.level >= PINGZHI.green) {
                    gailv.green = 0
                }
            }
            let _blue = gailv.blue
            if (gailv.blue != 0) {
                if (config && config.level >= PINGZHI.blue) {
                    gailv.blue = 0
                } else {
                    gailv.blue = _green + gailv.blue
                }
            }
            let _purple = gailv.purple
            if (gailv.purple != 0) {
                if (config && config.level >= PINGZHI.purple) {
                    gailv.purple = 0
                } else {
                    gailv.purple = _green + _blue + gailv.purple
                }
            }
            let _orange = gailv.orange
            if (gailv.orange != 0) {
                if (config && config.level >= PINGZHI.orange) {
                    gailv.orange = 0
                } else {
                    gailv.orange = _green + _blue + _purple + gailv.purple
                }
            }
            let _color = gailv.color
            if (gailv.color != 0) {
                if (config && config.level >= PINGZHI.color) {
                    gailv.color = 0
                } else {
                    gailv.color = _green + _blue + _purple + _orange + gailv.color
                }
            }

            let pingzhi
            if (num > 0 && num <= gailv.green) {
                pingzhi = PINGZHI.green
            } else if (num > gailv.green && num <= gailv.blue) {
                pingzhi = PINGZHI.blue
            } else if (num > gailv.blue && num <= gailv.purple) {
                pingzhi = PINGZHI.purple
            } else if (num > gailv.purple && num <= gailv.orange) {
                pingzhi = PINGZHI.orange
            } else if (num > gailv.orange && num <= gailv.color) {
                pingzhi = PINGZHI.color
            }
            return pingzhi
        }


    }

    public static getWuPingGaiLvByMyLevel() {
        let level = User.getMyLevel()
        let gailv
        for (let i = 0; i < wuPingGaiLv.length; i++) {
            if (level >= wuPingGaiLv[i].level) {
                gailv = wuPingGaiLv[i]
            } else {
                break
            }
        }
        return gailv
    }

    public static getPingZhiGaiLvByMyLevel() {
        let level = User.getMyLevel()
        let gailv
        for (let i = 0; i < pingZhiGaiLv.length; i++) {
            if (level >= pingZhiGaiLv[i].level) {
                gailv = pingZhiGaiLv[i]
            } else {
                break
            }
        }
        return gailv
    }

    public static getZhuZi() {
        return zhuzis[this.getRandomInt(0, zhuzis.length - 1)]
    }

    public static getZhuZiPingZhi() {
        return this.getRandomInt(1, 7)
    }

    /**
     * 随机数
     * @param min 最小数
     * @param max 最大数
     * @returns 
     */
    public static getRandomInt(min: number, max: number): number {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }
}