local SEventDispatchCenter = {}

SEventDispatchCenter.EventType = {
    -- UPDATE EVENT
    UPDATE_RETRY                    = "UPDATE_RETRY",
    UPDATE_STATE_INFO               = "UPDATE_STATE_INFO",
    UPDATE_PROGRESS_PERCENT         = "UPDATE_PROGRESS_PERCENT",
    UPDATE_SHOW_TIPS                = "UPDATE_SHOW_TIPS",

    -- NET EVENT
    NET_CONNECT_STATE               = "NET_CONNECT_STATE",
    NET_LOGIN_RET                   = "NET_LOGIN_RET",
    NET_UPDATE_BASE_DATA            = "NET_UPDATE_BASE_DATA",
    NET_MODIFY_PLAYER_NAME_RET      = "NET_MODIFY_PLAYER_NAME_RET",
    NET_UPDATE_DATA_FINISH          = "NET_UPDATE_DATA_FINISH",
    NET_UPDATE_SERVER_TIME          = "NET_UPDATE_SERVER_TIME",
    NET_UPDATE_PLAYER_COIN          = "NET_UPDATE_PLAYER_COIN",

    -- TALENT
    NET_UPDATE_TALENT               = "NET_UPDATE_TALENT",

    -- SKILL
    NET_INIT_SKILL_LIST             = "NET_INIT_SKILL_LIST",
    NET_UPDATE_SKILL_LIST           = "NET_UPDATE_SKILL_LIST",
    NET_UPDATE_SKILL_INFO           = "NET_UPDATE_SKILL_INFO",
    NET_INIT_TRAIN_SKILL_LIST       = "NET_INIT_TRAIN_SKILL_LIST",
    NET_REMOVE_TRAIN_SKILL_LIST     = "NET_REMOVE_TRAIN_SKILL_LIST",
    NET_REMOVE_TRAIN_SKILL_INFO     = "NET_REMOVE_TRAIN_SKILL_INFO",
    NET_UPDATE_TRAIN_SKILL_LIST     = "NET_UPDATE_TRAIN_SKILL_LIST",
    NET_UPDATE_TRAIN_SKILL_INFO     = "NET_UPDATE_TRAIN_SKILL_INFO",
    NET_ADD_TRAIN_SKILL_INFO        = "NET_ADD_TRAIN_SKILL_INFO",

    -- ITEM
    NET_UPDATE_ITEM_LIST            = "NET_UPDATE_ITEM_LIST",
    NET_UPDATE_ITEM_INFO            = "NET_UPDATE_ITEM_INFO",
    
    -- UI EVENT
    UI_UPDATE_SYNC_STEP             = "UI_UPDATE_SYNC_STEP",
    UI_BATTLE_MATCH                 = "UI_BATTLE_MATCH",
    UI_UPDATE_SKILL_LIST            = "UI_UPDATE_SKILL_LIST",
    UI_UPDATE_SKILL_TRAIN_LIST      = "UI_UPDATE_SKILL_TRAIN_LIST",
    UI_DELETE_TRAIN_SKILL_LIST      = "UI_DELETE_TRAIN_SKILL_LIST",
    UI_DELETE_TRAIN_SKILL           = "UI_DELETE_TRAIN_SKILL",
    UI_CLOSE_SKILL_DETAIL_DIALOG    = "UI_CLOSE_SKILL_DETAIL_DIALOG",
    UI_UPDATE_TRAIN_SKILL_TIME      = "UI_UPDATE_TRAIN_SKILL_TIME",
    UI_CLOSE_MODIFY_PLAYER_NAME     = "UI_CLOSE_MODIFY_PLAYER_NAME",

    -- BATTLE EVENT
    BATTLE_MATCH_SUCCESS            = "BATTLE_MATCH_SUCCESS",
    DRAG_SKILL_MOUSE_POSITION       = "DRAG_SKILL_MOUSE_POSITION",
    START_MOVE                      = "START_MOVE",
    START_MOVE_RET                  = "START_MOVE_RET",
    SKILL_INDICATOR                 = "SKILL_INDICATOR",
}

SEventDispatchCenter.EventQuene = {}

function SEventDispatchCenter:RegisterEvent(eventType, callback)
    print("--------------------> SEventDispatchCenter:RegisterEvent eventType", eventType, callback)
    if self.EventType[eventType] == nil or type(callback) ~= "function" then
        print("SEventDispatchCenter:RegisterEvent param is error~ eventType:", eventType)
        return
    end
    
    if self.EventQuene[eventType] == nil then
        self.EventQuene[eventType] = {}
    end
    
    --local index = table.getn(self.EventQuene[eventType])
    --self.EventQuene[eventType][index + 1] = callback
    table.insert(self.EventQuene[eventType], callback)
end

function SEventDispatchCenter:UnregisterEvent(eventType, callback)
    print("--------------------> SEventDispatchCenter:UnregisterEvent eventType", eventType, callback)
    if self.EventQuene[eventType] == nil or type(callback) ~= "function" then
        print("SEventDispatchCenter:UnregisterEvent param is error~ eventType:", eventType)
        return
    end
    
    for k, v in pairs(self.EventQuene[eventType]) do
        if callback == v then
            table.remove(self.EventQuene[eventType], k)
            return
        end
    end
end

function SEventDispatchCenter:DispatchEvent(eventType, ...)
    print("--------------------> SEventDispatchCenter:Dispatch eventType", eventType)
    if self.EventType[eventType] == nil then
        print("SEventDispatchCenter:DispatchEvent eventType is unknow : ", eventType)
        return    
    end

    if self.EventQuene[eventType] == nil then
        print("SEventDispatchCenter:DispatchEvent callback is nil eventType:", eventType)
        return 
    end
    
    for k, v in pairs(self.EventQuene[eventType]) do
        v(...)
    end
end

return SEventDispatchCenter