-- ABS 周卡

local Config = require("Config")
local AbsActExcel = require("excel.absAct")
local Lang = require("common.Lang")
local Util = require("common.Util")
local Msg = require("core.Msg")
local AbsActDefine = require("absAct.AbsActDefine")
local ObjHuman = require("core.ObjHuman")
local Broadcast = require("broadcast.Broadcast")
local MangHeLogic = require("absAct.MangHeLogic")
local MailExcel = require("excel.mail")
local MailManager = require("mail.MailManager")
local CommonDB = require("common.CommonDB")
local AbsActLogic = require("absAct.AbsActLogic")
local HeroGrid = require("hero.HeroGrid")
local DrawCardLogic = require("drawCard.DrawCardLogic")
local Log = require("common.Log")
local HeroBook = require("hero.HeroBook")
local HeroExcel = require("excel.hero")
local HeroLogic = require("hero.HeroLogic")
local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
local Grid = require("bag.Grid")
local BuyLogic = require("topup.BuyLogic")
local BuyExcel = require("excel.buy")
local TopupLogic = require("topup.TopupLogic")
local BagLogic = require("bag.BagLogic")
local YunYingLogic = require("yunying.YunYingLogic")

DAY_CNT = 365
local ABS365CARDID = 13001

local function initDB(human, id)
    if not human.db.absAct[id] then return end
    human.db.absAct[id].dayCnt = human.db.absAct[id].dayCnt or DAY_CNT
    human.db.absAct[id].item = human.db.absAct[id].item or { }
    human.db.absAct[id].draw = human.db.absAct[id].draw or 1
end

function isOpen(human, YYInfo, funcConfig)
    local state, endTime, startTime = AbsActLogic.isStarted(human, funcConfig.funcID)
    if not state then return end
    local absAct = human.db.absAct[funcConfig.funcID]
    if absAct and absAct.dayCnt and absAct.dayCnt <= 0 and #absAct.item <= 0 then
        return false
    end
    return true, endTime, startTime
end

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

function isRed(human, YYInfo, funcConfig)
    local absAct = human.db.absAct[funcConfig.funcID]
    if not absAct then return true end

    if not absAct.dayCnt or absAct.dayCnt <= 0 then return end

    if absAct.draw == 1 then
       return true 
    end

    if absAct.active then
       if #absAct.item > 0 then
          return true
       end
    end

    return false
end

function getAndSendMsg(human, id, config)
    local msgRet = Msg.gc.GC_ABS_365CARD_QUERY
    msgRet.leftTime = 0
    msgRet.actId = id

    local actId = config.actId
    local abs365CardConfig = AbsActExcel.abs365Card[actId]
    if not abs365CardConfig then return end

    local buyItemConfig = BuyExcel.libao[TopupLogic.TOPUP_LIBAO_ID3]
    if not buyItemConfig then return end

    msgRet.items[0] = #abs365CardConfig.item
    for i = 1, #abs365CardConfig.item do
        Grid.makeItem(msgRet.items[i], abs365CardConfig.item[i][1], abs365CardConfig.item[i][2])
    end

    -- 获得的道具
    local absAct = human.db.absAct[id]
    initDB(human, id)

    msgRet.getItems[0] = 0
    if absAct.item then
        msgRet.getItems[0] = #absAct.item
        for i = 1, #absAct.item do
            Grid.makeItem(msgRet.getItems[i], absAct.item[i][1], absAct.item[i][2])
        end
    end

    msgRet.newItem[0] = 0
    if absAct.newItem then
        Grid.makeItem(msgRet.newItem[1], absAct.newItem[1], absAct.newItem[2])
        msgRet.newItem[0] = 1
        absAct.newItem = nil
    end

    msgRet.leftDay = absAct and absAct.dayCnt or DAY_CNT
    msgRet.draw = absAct and absAct.draw or 0
    msgRet.active = absAct.active or 0

    msgRet.buyItem.item[0] = #buyItemConfig.reward
    for i = 1, #buyItemConfig.reward do
        Grid.makeItem(msgRet.buyItem.item[i], buyItemConfig.reward[i][1], buyItemConfig.reward[i][2])
    end

    msgRet.buyItem.cnt = 1
    msgRet.buyItem.id = TopupLogic.TOPUP_LIBAO_ID3
    msgRet.buyItem.maxCnt = buyItemConfig.cnt
    msgRet.buyItem.icon = buyItemConfig.icon or 0
    msgRet.buyItem.name = ""
    BuyLogic.fontBuyItem(human, msgRet.buyItem.buyMsg[1], buyItemConfig.buyID)
    msgRet.buyItem.buyMsg[0] = 1
    msgRet.buyItem.needItem[0] = 0
    Msg.send(msgRet, human.fd)
end

-- 领取道具
function get(human, id)
    local state, endTime, starTime = AbsActLogic.isStarted(human, id)
    if not state then return end

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

    local absAct = human.db.absAct[id]
    if not absAct then return end

    if not absAct.active then return end

    if #absAct.item <= 0 then return end
    
    BagLogic.addItemList(human, absAct.item, "abs_365Card")

    absAct.item = {}

    YunYingLogic.updateIcon(YYInfo[id], human)
    YunYingLogic.sendGroupUpdate(YYInfo[id], human, config.panelID)

    getAndSendMsg(human, id, config)
end


-- 积分购买
function abs365Card(human, id, buyConf, isFirst, cnt, nBuyNum)
    local state, endTime, starTime = AbsActLogic.isStarted(human, id)
    if not state then return end

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

    local buyItemConfig = BuyExcel.libao[TopupLogic.TOPUP_LIBAO_ID3]
    if not buyItemConfig then return end

    AbsActLogic.checkAbsActClean(human, id)

    human.db.absAct[id].active = 1

    BagLogic.addItemList(human, buyItemConfig.reward, "abs_365Card")

    HeroLogic.heroJueXingOneClickQuery(human)

    -- 刷新
    getAndSendMsg(human, id, config)
end

-- 根据权重算索引
local function randomItemIndex(itemTable)
    local totalWeight = 0
    for i = 1, #itemTable do
        local item = itemTable[i]
        totalWeight = totalWeight + item[3]
    end

    if totalWeight <= 0 then
        return
    end

    local len = 0
    local index = nil
    local random = math.random(1, totalWeight)
    for i = 1, #itemTable do
        local item = itemTable[i]
        local weight = item[3]
        if random <= weight then
            index = i
            break
        else
            random = random - weight
        end
    end
    return index
end

function updateDaily(human, id)
    local state, endTime, starTime = AbsActLogic.isStarted(human, id)
    if not state then return end

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

    local actId = config.actId
    local abs365CardConfig = AbsActExcel.abs365Card[actId]
    if not abs365CardConfig then return end

    local absAct = human.db.absAct[id]
    if not absAct then return end

    if not absAct.dayCnt or absAct.dayCnt <= 0 then return end

    absAct.draw = 1
end

function draw(human, id)
    local state, endTime, starTime = AbsActLogic.isStarted(human, id)
    if not state then return end

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

    local actId = config.actId

    local abs365CardConfig = AbsActExcel.abs365Card[actId]
    if not abs365CardConfig then return end

    local absAct = human.db.absAct[id]
    if not absAct then return end

    if not absAct.dayCnt or absAct.dayCnt <= 0 then return end

    if not absAct.draw or absAct.draw ~= 1 then return end

    -- 随机道具1 奖池道具
    local index = randomItemIndex(abs365CardConfig.item)

    if not index or not abs365CardConfig.item[index] then return end

    local index2 = randomItemIndex(abs365CardConfig.item2)

    if not index2 or not abs365CardConfig.item2[index2] then return end

    absAct.dayCnt = absAct.dayCnt - 1
    absAct.draw = 0

    -- 加入到已有的道具中
    local itemReward = { [1] = { abs365CardConfig.item2[index2][1], abs365CardConfig.item2[index2][2] } }
    BagLogic.addItemList(human, itemReward, "abs_365Card")

    absAct.newItem = { abs365CardConfig.item[index][1], abs365CardConfig.item[index][2] }
    local bAdd = false
    for i = 1, #absAct.item do
        local item = absAct.item[i]
        if item[1] == abs365CardConfig.item[index][1] then
            item[2] = item[2] + abs365CardConfig.item[index][2]
            bAdd = true
            break
        end
    end

    if not bAdd then
        absAct.item[#absAct.item + 1] = { abs365CardConfig.item[index][1], abs365CardConfig.item[index][2] }
    end

    YunYingLogic.updateIcon(YYInfo[id], human)
    YunYingLogic.sendGroupUpdate(YYInfo[id], human, config.panelID)

    -- 刷新
    getAndSendMsg(human, id, config)
end

function IsBuyCard(human)
    if not human.db.absAct or not human.db.absAct[ABS365CARDID] then
        return 0
    end

    return human.db.absAct[ABS365CARDID].active and human.db.absAct[ABS365CARDID].active or 0
end

-- function GetRemainNum(human, nBuyID)
--     local bBuy = IsBuyCard(human)
--     -- 未购买
--     if 0 == bBuy then
--         return 1
--     else 
--         return 0
--     end
-- end