--[[
	Addon: util
	Author: TProg Taonnor
	Created by @Taonnor
]]--

-- Version Control
local VERSION = 1

--[[
	Class definition (Static class)
]]--
-- A table in hole lua workspace must be unique
-- The group helper is global util table, used in several of my addons
-- The table is created as "static" class without constructor and static helper methods
if (TaosGroupHelper == nil or TaosGroupHelper.Version == nil or TaosGroupHelper.Version < VERSION) then
	TaosGroupHelper = {}
	TaosGroupHelper.__index = TaosGroupHelper
    TaosGroupHelper.Version = VERSION

    -- Global Callback Variables
    TAO_GROUP_CHANGED = "TAO-GroupChanged"
    TAO_UNIT_GROUPED_CHANGED = "TAO-UnitGroupedChanged"

	-- local members
    local name = "TaosGroupHelper"
    local isUnitGrouped = false

    --[[
        GetIsUnitGrouped Gets the current UnitGrouped state
    ]]--
    function GetIsUnitGrouped()
        return isUnitGrouped
    end

    --[[
	    Called when group updated
    ]]--
    local function OnGroupUpdate()
        local isGrouped = IsUnitGrouped("player")

        if (isGrouped ~= isUnitGrouped) then
            isUnitGrouped = isGrouped
            CALLBACK_MANAGER:FireCallbacks(TAO_UNIT_GROUPED_CHANGED, isGrouped)
        end
    end

    --[[
	    Called when group member joined group
    ]]--
    local function OnGroupMemberJoined()
        CALLBACK_MANAGER:FireCallbacks(TAO_GROUP_CHANGED)
        OnGroupUpdate()
    end

    --[[
	    Called when group member left group
    ]]--
    local function OnGroupMemberLeft()
        CALLBACK_MANAGER:FireCallbacks(TAO_GROUP_CHANGED)
        OnGroupUpdate()
    end

    --[[
	    Called when loading UI finished
    ]]--
    local function OnPlayerActivated(eventCode)
        -- Initial state
        isUnitGrouped = IsUnitGrouped("player")

        CALLBACK_MANAGER:FireCallbacks(TAO_UNIT_GROUPED_CHANGED, isUnitGrouped)
        CALLBACK_MANAGER:FireCallbacks(TAO_GROUP_CHANGED)
    end

    --[[
        Register events
    ]]--
	EVENT_MANAGER:RegisterForEvent(name, EVENT_GROUP_MEMBER_JOINED, OnGroupMemberJoined)
	EVENT_MANAGER:RegisterForEvent(name, EVENT_GROUP_MEMBER_LEFT, OnGroupMemberLeft)
    EVENT_MANAGER:RegisterForEvent(name, EVENT_PLAYER_ACTIVATED, OnPlayerActivated)

end