--触发事件处理模块
--需要保证订阅在前, 触发在后


local TriggerDefine = require("trigger.TriggerDefine")


--订阅列表
local moniterTbl = {}


-- 注册事件
-- 为每个玩家维护订阅表
function SubscribeEvent(eventType, uuid, callback)
    if not moniterTbl[uuid] then
        moniterTbl[uuid] = {}
    end

    if not moniterTbl[uuid][eventType] then
        moniterTbl[uuid][eventType] = {}
    else
        for i, funcCallBack in ipairs(moniterTbl[uuid][eventType]) do
            if funcCallBack == callback then
                print("[SubscribeEvent] 重复订阅消息 eventType = "..eventType)
                return
            end
        end
    end
    
    table.insert(moniterTbl[uuid][eventType], callback)
end

-- 发布订阅
function PublishEvent(eventType, uuid, nValue1, nValue2, nValue3)
    if moniterTbl[uuid] and moniterTbl[uuid][eventType] then
        for i, callback in ipairs(moniterTbl[uuid][eventType]) do
            --print("[PublishEvent] 触发回调 eventType = "..eventType.." i = "..i)
            pcall(callback, eventType, uuid, nValue1, nValue2, nValue3)
        end
    end
end

-- 取消订阅
function UnsubscribeEvent(eventType, uuid, callback)
    if moniterTbl[uuid] and moniterTbl[uuid][eventType] then
        local tSubData = moniterTbl[uuid][eventType]
        for i, cb in ipairs(tSubData) do
            if cb == callback then
                table.remove(tSubData, i)
                break
            end
        end

        if nil == _G.next(tSubData) then
            moniterTbl[uuid][eventType] = nil
        end
    end
end

-- 移除所有订阅(玩家下线)
function RemoveAllscribeEvent(uuid)
    moniterTbl[uuid] = nil
end

function onLogout(human)
    -- 这里应该先发下线事件，但是目前没有这种需要先不管
    RemoveAllscribeEvent(human.db._id)
    print("[TriggerLogic-onLogout] 玩家下线移除所有事件订阅 name = "..human.db.name)
end









