--[[
	Addon: Taos Group Tools
	Author: TProg Taonnor
	Created by @Taonnor
]]--

--[[
	Local variables
]]--
local LOG_ACTIVE = false

local _logger = nil
local _control = nil

--[[
	Table GroupUltimateSelector
]]--
TGT_GroupUltimateSelector = {}
TGT_GroupUltimateSelector.__index = TGT_GroupUltimateSelector

--[[
	Table Members
]]--

--[[
	SetUltimateIcon sets the button icon in base of staticUltimateID
]]--
function TGT_GroupUltimateSelector.SetUltimateIcon(staticUltimateID)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_GroupUltimateSelector.SetUltimateIcon")
        _logger:logDebug("staticUltimateID", staticUltimateID)
    end

    local icon = "/esoui/art/icons/icon_missing.dds"

    if (staticUltimateID ~= 0) then
        icon = GetAbilityIcon(staticUltimateID)
    end

    local iconControl = _control:GetNamedChild("SelectorButtonControl"):GetNamedChild("Icon")

    if (icon ~= nil and iconControl ~= nil) then
        iconControl:SetTexture(icon)
    else
        _logger:logError("TGT_GroupUltimateSelector.SetUltimateIcon, icon is " .. tostring(icon) .. "; iconControl is " .. tostring(iconControl))
    end
end

--[[
	SetControlMovable sets the Movable and MouseEnabled flag in UI elements
]]--
function TGT_GroupUltimateSelector.SetControlMovable(isMovable)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_GroupUltimateSelector.SetControlMovable")
        _logger:logDebug("isMovable", isMovable)
    end

    _control:GetNamedChild("MovableControl"):SetHidden(isMovable == false)

    _control:SetMovable(isMovable)
	_control:SetMouseEnabled(isMovable)
end

--[[
	RestorePosition sets TGT_GroupUltimateSelector on settings position
]]--
function TGT_GroupUltimateSelector.RestorePosition(posX, posY)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_GroupUltimateSelector.RestorePosition")
        _logger:logDebug("posX, posY", posX, posY)
    end

	_control:ClearAnchors()
	_control:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, posX, posY)
end

--[[
	OnTGT_GroupUltimateSelectorMoveStop saves current TGT_GroupUltimateSelector position to settings
]]--
function TGT_GroupUltimateSelector.OnGroupUltimateSelectorMoveStop()
    if (LOG_ACTIVE) then _logger:logTrace("TGT_GroupUltimateSelector.OnGroupUltimateSelectorMoveStop") end

	local left = _control:GetLeft()
	local top = _control:GetTop()

    TGT_SettingsHandler.SavedVariables.SelectorPosX = left
    TGT_SettingsHandler.SavedVariables.SelectorPosY = top

    if (LOG_ACTIVE) then
        _logger:logDebug("PosX, PosY", TGT_SettingsHandler.SavedVariables.SelectorPosX, TGT_SettingsHandler.SavedVariables.SelectorPosY)
    end
end

--[[
	OnGroupUltimateSelectorClicked shows ultimate group menu
]]--
function TGT_GroupUltimateSelector.OnGroupUltimateSelectorClicked()
    if (LOG_ACTIVE) then _logger:logTrace("TGT_GroupUltimateSelector.OnGroupUltimateSelectorClicked") end

    local button = _control:GetNamedChild("SelectorButtonControl"):GetNamedChild("Button")

    if (button ~= nil) then
        CALLBACK_MANAGER:RegisterCallback(TGT_SET_ULTIMATE_GROUP, TGT_GroupUltimateSelector.OnSetUltimateGroup)
        CALLBACK_MANAGER:FireCallbacks(TGT_SHOW_ULTIMATE_GROUP_MENU, button)
    else
        _logger:logError("TGT_GroupUltimateSelector.OnGroupUltimateSelectorClicked, button nil")
    end
end

--[[
	OnSetUltimateGroup sets ultimate group for button
]]--
function TGT_GroupUltimateSelector.OnSetUltimateGroup(group)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_GroupUltimateSelector.OnSetUltimateGroup")
        _logger:logDebug("group.GroupName", group.GroupName)
    end

    CALLBACK_MANAGER:UnregisterCallback(TGT_SET_ULTIMATE_GROUP, TGT_GroupUltimateSelector.OnSetUltimateGroup)

    if (group ~= nil) then
        TGT_SettingsHandler.SetStaticUltimateIDSettings(group.GroupAbilityId)
    else
        _logger:logError("TGT_UltimateGroupMenu.ShowUltimateGroupMenu, group nil")
    end
end

--[[
	SetControlHidden sets hidden on control
]]--
function TGT_GroupUltimateSelector.SetControlHidden(isHidden)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_GroupUltimateSelector.SetControlHidden")
        _logger:logDebug("isHidden", isHidden)
    end

    if (GetIsUnitGrouped()) then
        _control:SetHidden(isHidden)
    else
        _control:SetHidden(true)
    end
end

--[[
	SetControlActive activates/deactivates control
]]--
function TGT_GroupUltimateSelector.SetControlActive()
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_GroupUltimateSelector.SetControlActive")
    end

    local isHidden = TGT_SettingsHandler.IsControlsVisible() == false
    if (LOG_ACTIVE) then _logger:logDebug("isHidden", isHidden) end

    TGT_GroupUltimateSelector.SetControlHidden(isHidden or CurrentHudHiddenState())

    if (isHidden) then
        CALLBACK_MANAGER:UnregisterCallback(TGT_MOVABLE_CHANGED, TGT_GroupUltimateSelector.SetControlMovable)
        CALLBACK_MANAGER:UnregisterCallback(TGT_STATIC_ULTIMATE_ID_CHANGED, TGT_GroupUltimateSelector.SetUltimateIcon)
        CALLBACK_MANAGER:UnregisterCallback(TAO_HUD_HIDDEN_STATE_CHANGED, TGT_GroupUltimateSelector.SetControlHidden)
    else
        TGT_GroupUltimateSelector.SetControlMovable(TGT_SettingsHandler.SavedVariables.Movable)
        TGT_GroupUltimateSelector.RestorePosition(TGT_SettingsHandler.SavedVariables.SelectorPosX, TGT_SettingsHandler.SavedVariables.SelectorPosY)
        TGT_GroupUltimateSelector.SetUltimateIcon(TGT_SettingsHandler.SavedVariables.StaticUltimateID)

        CALLBACK_MANAGER:RegisterCallback(TGT_MOVABLE_CHANGED, TGT_GroupUltimateSelector.SetControlMovable)
        CALLBACK_MANAGER:RegisterCallback(TGT_STATIC_ULTIMATE_ID_CHANGED, TGT_GroupUltimateSelector.SetUltimateIcon)
        CALLBACK_MANAGER:RegisterCallback(TAO_HUD_HIDDEN_STATE_CHANGED, TGT_GroupUltimateSelector.SetControlHidden)
    end
end

--[[
	Initialize initializes TGT_GroupUltimateSelector
]]--
function TGT_GroupUltimateSelector.Initialize(logger)
    if (LOG_ACTIVE) then
        logger:logTrace("TGT_GroupUltimateSelector.Initialize")
    end

    _logger = logger
    _control = TGT_UltimateSelectorControl

    TGT_GroupUltimateSelector.SetUltimateIcon(staticUltimateID)

    CALLBACK_MANAGER:RegisterCallback(TGT_IS_ZONE_CHANGED, TGT_GroupUltimateSelector.SetControlActive)
    CALLBACK_MANAGER:RegisterCallback(TAO_UNIT_GROUPED_CHANGED, TGT_GroupUltimateSelector.SetControlActive)
end