local Msg = require("core.Msg")
local Util = require("common.Util")
local Lang = require("common.Lang")
local AbsActLogic = require("absAct.AbsActLogic")
local AbsReachRankDB = require("absAct.AbsReachRankDB")
local Broadcast = require("broadcast.Broadcast")
local YunYingLogic = require("yunying.YunYingLogic")
local AbsIceDragonRank = require("absAct.AbsIceDragonRank")
--[[
    abs开服排名类活动 现有[合服活动充值排名]
    local:
        getDayLeftTime()        -- 获得当天剩余时间秒
        getActLeftTime()        -- 得到活动需要用到的时间秒
	public:
		isActive()				-- 激活状态
		isOpen()                -- 活动开启	
		getLeftTime()           -- 得到活动剩余时间	
		getAndSendMsg()			-- 发送活动信息
        rewardQuery()           -- 奖励详情
        onCharge()			    -- 充值回调
		onZeroAll()             -- 零点处理回调
--]]

local function getDayLeftTime()
	local now = os.time()
 	local endTime = Util.getDayStartTime(now) + 86400
    
    return endTime - now
end

local function getActLeftTime(funcID, funcRankType)
    for tempFuncRankType,typeInfo in ipairs(AbsReachRankDB.FUNC_RANK_TYPE_INFOS) do
        if funcRankType == tempFuncRankType then
            if typeInfo.isDayReward then
                return getDayLeftTime()
            else
                local ret, endTime, startTime = AbsActLogic.isStarted(human, funcID)
                if ret == true then
                    return endTime - os.time()
                else
                    return 0
                end
            end        
        end 
    end
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 getLeftTime(human, YInfo, funcConfig)
    return getActLeftTime(funcConfig.funcID)
end

function getAndSendMsg(human, funcID)
    AbsIceDragonRank.query(human)
	local actLeftTime = getActLeftTime(funcID, funcRankType)
	local maxSendRank = AbsReachRankDB.getMaxSendRank(funcID)

	local msgRet = Msg.gc.GC_ABS_REACH_RANK_QUERY
    msgRet.actId = funcID
    local len = 0
    for funcRankType,typeInfo in ipairs(AbsReachRankDB.FUNC_RANK_TYPE_INFOS) do
        if AbsReachRankDB.getMinRankValue(funcID, funcRankType) then
            len = len + 1
            msgRet.list[len].funcRankType = funcRankType
            msgRet.list[len].leftTime = getActLeftTime(funcID, funcRankType)
             
            AbsReachRankDB.wrapOwnerData(funcID, funcRankType, msgRet.list[len].onwerData, human.db._id)
            for rank = 1,maxSendRank do
                AbsReachRankDB.wrapRankList(funcID, funcRankType, msgRet.list[len].list[rank], rank)
            end
            msgRet.list[len].list[0] = maxSendRank
        end
    end
    msgRet.list[0] = len
	Msg.send(msgRet, human.fd)
end

function rewardQuery(human, funcID, funcRankType)
    if funcRankType == 3 then
        AbsIceDragonRank.queryReward(human)
    else
        local msgRet = Msg.gc.GC_ABS_REACH_RANK_REWARD_QUERY
        AbsReachRankDB.rewardQuery(human, funcID, funcRankType, msgRet)
    end
end

function onCharge(human, price, funcID)
    local funcConfig = YunYingLogic.getFuncConfig(funcID)
	if not funcConfig then return end

    if not isOpen(human, nil, funcConfig) then return end

    if funcConfig.param[1] == "topupRank" then  -- 是充值排行榜
        AbsReachRankDB.onValueAdd(human, funcID, price)
    end
end
 
function onZeroAll(funcID)
    AbsReachRankDB.onRewardSend(funcID)
    AbsIceDragonRank.onZero(funcID)
end

function updateDaily(human, funcID)
    AbsReachRankDB.updateDaily(human, funcID)
end