-- 特权

local Config = require("Config")
local Msg = require("core.Msg")
local ObjHuman = require("core.ObjHuman")
local Util = require("common.Util")
local Lang = require("common.Lang")
local DB = require("common.DB")
local PresentExcel = require("excel.present")
local MailExcel = require("excel.mail")
local VipExcel = require("excel.vip")
local BuyExcel = require("excel.buy")
local Grid = require("bag.Grid")
local ItemDefine = require("bag.ItemDefine")
local MailManager = require("mail.MailManager")
local VipLogic = require("vip.VipLogic")
local Broadcast = require("broadcast.Broadcast")
local BuyLogic = require("topup.BuyLogic")
local KingWorldLogic = require("present.KingWorldLogic")
local BagLogic = require("bag.BagLogic")
local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
local LuaMongo = _G.lua_mongo
local PanelDefine = require("broadcast.PanelDefine")
local YunYingLogic = require("yunying.YunYingLogic")
local SceneHandler = require("scene.Handler")
local FuliExcel = require("excel.fuli")

-- buyid
CONFIG_ID1 = 1    -- 钻石基金
CONFIG_ID2 = 2    -- 钻石基金
CONFIG_ID3 = 3    -- 无限高抽

BUYSTATE0 = 0 -- 未购买
BUYSTATE1 = 1 -- 已购买1
BUYSTATE2 = 2 -- 已购买2
BUYSTATE3 = 3 -- 已购买3

STATE0 = 0 -- 不可领取
STATE1 = 1 -- 可以领取
STATE2 = 2 -- 已经领取


local ACT_ID205 = 205  -- 基金
local ACT_ID311 = 311 -- 无线高抽

-- 获取购买状态
local function getState(db, lv, id, flag)
    if db.get[id] then
        return STATE2
    end

    -- 无限高抽
    if flag == CONFIG_ID3 then
        if db.flag == flag and lv > FuliExcel.growFund[id].lv then
            return STATE1
        end
    else
        -- 基金
        if db.flag2 == flag and lv >= FuliExcel.growFund[id].lv then
            return STATE1
        end
    end

    return STATE0
end

-- 获取礼包获奖范围
local function getRange(flag)
    local conf = FuliExcel.growFundDefine[1]
    return conf.range[flag], conf.buyID[flag]
end

function initDB(human)
    human.db.fundFlag = human.db.fundFlag or { flag = 0, get = { }, flag2 = 0 }
    human.db.fundFlag.flag2 = human.db.fundFlag.flag2 or 0
    return human.db.fundFlag
end


-- 特权查询
function query(human, type)
    local db = initDB(human)
    local flag = CONFIG_ID1
    if type == CONFIG_ID3 then
       flag = db.flag == 0 and CONFIG_ID3 or db.flag
    else
       flag = db.flag2 == 0 and CONFIG_ID1 or db.flag2
    end

    local rangeConfig, buyID = getRange(flag)
    if not rangeConfig then return end

    local bAllBuy = true
    for i = rangeConfig[1], rangeConfig[2] do
       local state = getState(db, human.db.lv, i, CONFIG_ID1)
       if state ~= STATE2 then
          bAllBuy = false
          break
       end
    end

    local nBuyAll = bAllBuy and 1 or 0

    if type ~= CONFIG_ID3 and bAllBuy == true then
        local bAdd = false
        if flag == CONFIG_ID2 then
            flag = CONFIG_ID2 + 2
        elseif flag < CONFIG_ID2 then
            flag = CONFIG_ID2
        else
            flag = flag + 1
            bAdd = true
        end
        rangeConfig, buyID = getRange(flag)

        if not rangeConfig and not buyID and true == bAdd then
            flag = flag - 1
            rangeConfig, buyID = getRange(flag - 1)
        end
    end

    local msgRet = Msg.gc.GC_TEQUAN_ZSJIJIN_QUERY
    local net = msgRet.data
    local len = 0
    for i = rangeConfig[1], rangeConfig[2] do
        local config = FuliExcel.growFund[i]
        len = len + 1
        local netNode = net.lvRewardMsg[len]

        netNode.id = i
        netNode.lv = config.lv
        netNode.state = getState(db, human.db.lv, i, flag)
        if flag == CONFIG_ID3 then
            for j, h in ipairs(config.items) do
                Grid.makeItem(netNode.lvReward[j], h[1], h[2])
            end
            netNode.lvReward[0] = #config.items
        else
            Grid.makeItem(netNode.lvReward[1], ItemDefine.ITEM_ZUANSHI_ID, config.yuanbao)
            netNode.lvReward[0] = 1
        end
    end

    if type == CONFIG_ID3 then
        net.fundFlag = db.flag == flag and 1 or 0
    else
        net.fundFlag = db.flag2 == flag and 1 or 0
    end
    net.lvRewardMsg[0] = len
    BuyLogic.fontBuyItem(human, net.buyItem, buyID)
    Msg.send(msgRet, human.fd)
end

-- 钻石基金购买
function fund(human, funcID, buyConf, isFirst, cnt, nBuyNum)
    local yyConfig = YunYingLogic.getFuncConfig(funcID)
    
    local buyType = buyConf.args[1]
    local rangeConfig, buyID = getRange(buyType)
    if not rangeConfig then return end
    if buyConf.id ~= buyID then return end

    if buyType == CONFIG_ID3 then
       if yyConfig.panelID ~= PanelDefine.PANEL_ID_3607 then return end 
    else
       if yyConfig.panelID ~= PanelDefine.PANEL_ID_3506 then return end 
    end

    local db = initDB(human)
    db.flag2 = db.flag2 or 0

    if buyType == CONFIG_ID3 then
        db.flag = CONFIG_ID3
        YunYingLogic.sendGroupUpdate(YYInfo[funcID], human, PanelDefine.PANEL_ID_3607)
    else
        local trangeConfig, nbuyConfID = getRange(buyType)
        if buyType == CONFIG_ID1 or buyType == CONFIG_ID2 or (trangeConfig and nbuyConfID == buyID) then 
            db.flag2 = buyType
            YunYingLogic.sendGroupUpdate(YYInfo[funcID], human, PanelDefine.PANEL_ID_3506)
        end
    end

    Broadcast.sendErr(human, Lang.ITEM_BUY_SUCCESS)

    query(human, buyType)
end

-- 获取基金奖励
function fundGet(human, id, type)
    local config = FuliExcel.growFund[id]
    if not config then 
        return 
    end

    local db = initDB(human)
    local flag = nil
    local rangeConfig = nil
    if type == CONFIG_ID3 then
        rangeConfig = getRange(db.flag)
        if not rangeConfig then return end
        if id < rangeConfig[1] or id > rangeConfig[2] then
            return
        end
        flag = db.flag
    else
        -- 基金判定
        rangeConfig = getRange(db.flag2)
        if not rangeConfig then return end
        if id < rangeConfig[1] or id > rangeConfig[2] then
            return
        end
        flag = db.flag2
    end

    -- 是否已领取
    if getState(db, human.db.lv, id, flag) ~= STATE1 then
        return
    end
    db.get[id] = 1

    BagLogic.cleanMomentItemList()
    if type == CONFIG_ID3 then
        for i = 1, #config.items do
            BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, config.items[i][1], config.items[i][2])
        end

        for k, v in pairs(funcID) do
            YunYingLogic.sendGroupUpdate(YYInfo[k], human, PanelDefine.PANEL_ID_3607)
        end
    else
        BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, ItemDefine.ITEM_ZUANSHI_ID, config.yuanbao)

        for k, v in pairs(funcID) do
            YunYingLogic.sendGroupUpdate(YYInfo[k], human, PanelDefine.PANEL_ID_3506)
        end
    end
    BagLogic.addMomentItemList(human, "fundGet")

    query(human, type)
end


function isOpen(human,YYInfo,funcConfig)
    if not human.db.nFirstBuy or 1 ~= human.db.nFirstBuy then
        return false
    end

    if not SceneHandler.canCharge(human) then
        return
    end
	return true
end

function isRed(human, YYInfo, funcConfig)
    local actID = funcConfig.funcID
    local db = initDB(human)

    if actID == ACT_ID311 then
        local rangeConfig = getRange(db.flag)
        if rangeConfig then
            for i = rangeConfig[1], rangeConfig[2] do
                local config = FuliExcel.growFund[i]
                if getState(db, human.db.lv, i, CONFIG_ID3) == STATE1 then
                    return true
                end
            end
        end
    elseif actID == ACT_ID205 then
        local rangeConfig = getRange(db.flag2)
        if rangeConfig then
            for i = rangeConfig[1], rangeConfig[2] do
                local config = FuliExcel.growFund[i]
                if getState(db, human.db.lv, i, db.flag2) == STATE1 then
                    return true
                end
            end
        end
    end
end


function updateDaily(human)
    local db = initDB(human)
    local rangeConfig = getRange(db.flag)
    if rangeConfig then
        for i = rangeConfig[1], rangeConfig[2] do
            local config = FuliExcel.growFund[i]
            db.get[i] = nil
        end
    end
end

function onLevelUp(human, oldLv, newLv, id)
   YunYingLogic.sendGroupUpdate(YYInfo[id], human, PanelDefine.PANEL_ID_3506)
end

-- function GetRemainNum(human, nBuyID)
--     local tBuyInfo = FuliExcel.growFundDefine.buyID
--     local bHvae = false 
--     for _, v in ipairs(tBuyInfo) do
--         if v == nBuyID then
--             bHvae = true
--             break
--         end
--     end

--     if false == bHvae then
--         return 0
--     end

--     local tIDData = BuyExcel.buy[nBuyID]
--     local buyType = tIDData.args[1]

--     local db = initDB(human)
--     db.flag2 = db.flag2 or 0
--     if buyType == CONFIG_ID3 then
--         return (db.flag == CONFIG_ID3) and 0 or 1
--     else
--         return db.flag2 >= buyType and 0 or 1
--     end
-- end