local Msg = require("core.Msg")
local Util = require("common.Util")
local Lang  = require("common.Lang")
local Broadcast = require("broadcast.Broadcast")
local Grid = require("bag.Grid")
local BagLogic = require("bag.BagLogic")
local AbsActLogic = require("absAct.AbsActLogic")
local AbsActDefine = require("absAct.AbsActDefine")
local MailManager = require("mail.MailManager")
local MailExcel = require("excel.mail")
local AbsActExcel = require("excel.absAct")
local ItemExcel = require("excel.item").item
local ItemDefine = require("bag.ItemDefine")
local YunYingLogic = require("yunying.YunYingLogic")
local PanelDefine = require("broadcast.PanelDefine")

--[[ 
    占卜轮盘 
    1.actID(活动ID)或开始时间不一样则把DB数据重置
    2.抽奖规则,每次抽奖获得是策划按顺序配置的固定奖励
    3.轮盘奖励全部抽完,不刷新.
    4.活动开启时间,占卜功能中的每次合成和刷新都会获得配置相对应的道具奖励
    5.活动结束后,剩余的抽奖道具全部转化为其它配置的道具,并通过邮件发送
        DB:
        human.db.absAct[id] = {
           startTime = xxx,     --占卜轮盘开始时间
           times = xxx,         --占卜轮盘抽奖次数 
        }
        local: 
            getActID()          --获取活动id
            recoveryItem()      --活动结束后回收道具
            getInitDB()         --初始DB数据
            recovery()          --0点后自动执行回收逻辑
            getDrawCnt()        --获得下次抽奖需要的道具数量
        public:
            getAndSendMsg()     --发送活动数据
            get()               --活动抽奖
            isRed()             --红点提醒
            isActive()          --激活状态
            isOpen()            --活动开启
            updateDaily()       --0点时回调
            onZhanbuRefresh()   --占卜功能刷新时回调
            onZhanbuCompose()   --占卜合成时回调
            getZhanbuComposeCnt()--占卜合成时可得到道具数量
--]]

local function getActID(human)
    local state, id = AbsActLogic.isStartedByType(human, AbsActDefine.ABS_ACT_TYPE_9)
    if not state then return end

    return id
end

local function recoveryItem(human, id)
    local absActConfig = AbsActExcel.absActivity[id]
    if not absActConfig then return end
    local zblpConfig = AbsActExcel.zhanbuLunpan[absActConfig.actId]
    if not zblpConfig then 
        zblpConfig = AbsActExcel.zhanbuLunpan[absActConfig.turns[1]]
        if not zblpConfig then return end
    end

    local cnt = BagLogic.getItemCnt(human, zblpConfig.itemID)
    if cnt > 0 then
        BagLogic.delItem(human, zblpConfig.itemID, cnt, "zhanbulunpan_recovery")

        local mailConfig = MailExcel.mail[zblpConfig.mailID]
        local title = mailConfig.title
        local senderName = mailConfig.senderName
        local content = mailConfig.content

        local itemName = ItemExcel[zblpConfig.recoveryItemId].name
        local itemCnt = math.ceil(cnt / zblpConfig.recoveryProb[1]) * zblpConfig.recoveryProb[2]
        local items = { {zblpConfig.recoveryItemId, itemCnt} }

        MailManager.add(MailManager.SYSTEM, human.db._id, title, Util.format(content, itemName), items, senderName)	
    end
end

local function getInitDB(human, id, isRecovery)
    if not id then
        id = getActID(human)
        if not id then return end
    end

    local ret, endTime, startTime = AbsActLogic.isStarted(human, id)
    if not ret then
        --活动已结束,回收道具
        if isRecovery then
            recoveryItem(human, id)
        end
        return
    else
        --活动重新开过,回收道具
        local actDB = human.db.absAct[id]
        if actDB then
            actDB.times = actDB.times or 0
        end
        --[[ 不判断开始时间是否相等了  有玩家出现过活动在也回收了， 
            注释掉后，但后面如果配成每期之间没有间隔或在下一期开始后再上线，会出现回收不掉的问题。
            解决方案思路是存actID,例actDB.actId = absActConfig.actId,后面有配置这种情这样解决。
        if actDB and actDB.startTime ~= startTime then
            actDB.startTime = startTime
            actDB.times = 0  
            if isRecovery then
                recoveryItem(human, id)
            end      
        end --]]
        return actDB
    end
end

local function recovery(human, activityID)
    getInitDB(human, activityID, true)
end

local function getDrawCnt(human, times, id)
    local absActConfig = AbsActExcel.absActivity[id]
    if not absActConfig then return end

    local zblpConfig = AbsActExcel.zhanbuLunpan[absActConfig.actId]
    return zblpConfig.itemCnts[times + 1] or zblpConfig.itemCnts[#zblpConfig.itemCnts]
end

local init
function getAndSendMsg(human, id)
    local actDB = getInitDB(human, id)
    if not actDB then return end

    local absActConfig = AbsActExcel.absActivity[id]
    if not absActConfig then return end

    local msgRet = Msg.gc.GC_ABS_ZHAN_BU_LUA_PAN_QUERY
    if not init then
        local zblpConfig = AbsActExcel.zhanbuLunpan[absActConfig.actId]
        Grid.makeItem(msgRet.needItem, zblpConfig.itemID, 1)
        local len = 0
        for _, rewardCf in ipairs(zblpConfig.itemRewards) do
            len = len + 1
            Grid.makeItem(msgRet.list[len], rewardCf[1], rewardCf[2])
        end
        msgRet.list[0] = len

        len = 0
        for _, order in ipairs(zblpConfig.itemRewardOrders) do
            len = len + 1
            msgRet.orderList[len] = order
        end
        msgRet.orderList[0] = len

        len = 0
        for _, cnt in ipairs(zblpConfig.composeItemRewardCnts) do
            len = len + 1
            Grid.makeItem(msgRet.composeItems[len], zblpConfig.itemID, cnt)
        end
        msgRet.composeItems[0] = len

        Grid.makeItem(msgRet.resershItem, zblpConfig.itemID, zblpConfig.refreshItemRewardCnt)
        Grid.makeItem(msgRet.recoveryItem, zblpConfig.recoveryItemId, 1)
        msgRet.recoveryProb = tostring(zblpConfig.recoveryProb[1]) .. ":" .. tostring(zblpConfig.recoveryProb[2]) 
        
        init = true
    end

    msgRet.times = actDB.times
    msgRet.itemCnt = getDrawCnt(human, actDB.times, id)
    Msg.send(msgRet, human.fd)
end

function get(human, id)
    local actDB = getInitDB(human, id)
    if not actDB then return end

    local absActConfig = AbsActExcel.absActivity[id]
    if not absActConfig then return end

    local zblpConfig = AbsActExcel.zhanbuLunpan[absActConfig.actId]
    local nextTimes = actDB.times + 1
    
    local nextOrder = zblpConfig.itemRewardOrders[nextTimes]
    if not nextOrder then 
        return Broadcast.sendErr(human, Lang.ABS_ZHANBU_LUNPAN_ERR)
    end

    local drawItemCf = zblpConfig.itemRewards[nextOrder]
    if not drawItemCf then 
        return Broadcast.sendErr(human, Lang.ABS_ZHANBU_LUNPAN_ERR)
    end

    local needItemCnt = getDrawCnt(human, actDB.times, id)
    if not BagLogic.checkItemCnt(human, zblpConfig.itemID, needItemCnt) then
		return
	end

    BagLogic.delItem(human, zblpConfig.itemID, needItemCnt, "zhanbulunpan_get")

    actDB.times = nextTimes
    BagLogic.addItem(human, drawItemCf[1], drawItemCf[2], "zhanbulunpan_get")

    local msgRet = Msg.gc.GC_ABS_ZHAN_BU_LUA_PAN_GET
    msgRet.times = nextTimes
    msgRet.itemCnt = getDrawCnt(human, actDB.times, id)
    Msg.send(msgRet, human.fd)

    YunYingLogic.updateIcon(YYInfo[id], human)
    YunYingLogic.sendGroupUpdate(YYInfo[id], human, PanelDefine.PANEL_ID_3308)
end

function isRed(human, YYInfo, absActConfig)
    local actDB = getInitDB(human, absActConfig.funcID)
    if not actDB then return end

    local zblpConfig = AbsActExcel.zhanbuLunpan[absActConfig.actId]
    local nextTimes = actDB.times + 1
    
    local nextOrder = zblpConfig.itemRewardOrders[nextTimes]
    if not nextOrder then 
        return
    end

    local drawItemCf = zblpConfig.itemRewards[nextOrder]
    if not drawItemCf then 
        return 
    end

    local needItemCnt = getDrawCnt(human, actDB.times, absActConfig.funcID)
    local zblpConfig = AbsActExcel.zhanbuLunpan[absActConfig.actId]
    if zblpConfig.itemID == ItemDefine.ITEM_ZUANSHI_ID then
        local sum = human.db.zuanshi
        if sum < needItemCnt then
            return
        end
    end

    if BagLogic.getItemCnt(human, zblpConfig.itemID) < needItemCnt then
        return
    end

    return true
end

function isActive(human, YYInfo, funcConfig)
    return not isOpen(human, YYInfo, funcConfig)
end

function isOpen(human, YYInfo, funcConfig)
    return AbsActLogic.isStarted(human, funcConfig.funcID)
end

function updateDaily(human, activityID)
    recovery(human, activityID)
end

function onZhanbuRefresh(human)
   local id = getActID(human)
   if not id then return end

   local absActConfig = AbsActExcel.absActivity[id]
   if not absActConfig then return end
   local zblpConfig = AbsActExcel.zhanbuLunpan[absActConfig.actId]
   if not zblpConfig then return end

   local ret = AbsActLogic.isStarted(human, id) 
   if ret then
      if zblpConfig.refreshItemRewardCnt <= 0 then return end
      BagLogic.addItem(human, zblpConfig.itemID, zblpConfig.refreshItemRewardCnt, "zhanbulunpan_get")  
   end
end

function onZhanbuCompose(human, grade)
    local itemID,cnt = getZhanbuComposeCnt(human, grade)
    if cnt <= 0 then return end

    BagLogic.addItem(human, itemID, cnt, "zhanbulunpan_get")
end

function getZhanbuComposeCnt(human, grade)
   local id = getActID(human)
   if not id then return 0,0 end

   local absActConfig = AbsActExcel.absActivity[id]
   if not absActConfig then return 0,0 end

   local zblpConfig = AbsActExcel.zhanbuLunpan[absActConfig.actId]
   if not zblpConfig then return 0,0 end

   local ret = AbsActLogic.isStarted(human, id) 
   return ret and zblpConfig.itemID,zblpConfig.composeItemRewardCnts[grade] or 0,0
end