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

--[[
	Global callbacks
]]--
TGT_STYLE_CHANGED = "TGT-StyleChanged"
TGT_MOVABLE_CHANGED = "TGT-MovableChanged"
TGT_IS_ZONE_CHANGED = "TGT-IsZoneChanged"
TGT_VISIBLE_OFFSET_CHANGED = "TGT-VisibleOffsetChanged"
TGT_STATIC_ULTIMATE_ID_CHANGED = "TGT-StaticUltimateIDChanged"
TGT_SWIMLANE_ULTIMATE_GROUP_ID_CHANGED = "TGT-SwimlaneUltimateGroupIdChanged"
TGT_SWIMLANES_CHANGED = "TGT-SwimlanesChanged"
TGT_SWIMLANE_SCALING_CHANGED = "TGT-SwimlaneScalingChanged"

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

local SETTINGS_VERSION = 6

--[[
	Table TGT_SettingsHandler
]]--
TGT_SettingsHandler = {}
TGT_SettingsHandler.__index = TGT_SettingsHandler

--[[
	Table Members
]]--
TGT_SettingsHandler.Name = "TGT-SettingsHandler"
TGT_SettingsHandler.SettingsName = "TaosGroupToolSettings"
TGT_SettingsHandler.SavedVariables = nil

--[[
	Sets SetStyleSettings and fires TGT_STYLE_CHANGED callbacks
]]--
function TGT_SettingsHandler.SetStyleSettings(style)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_SettingsHandler.SetStyleSettings")
        _logger:logDebug("style", style)
    end

    local numberStyle = tonumber(style)

    if (numberStyle == 1 or numberStyle == 2 or numberStyle == 3) then
        TGT_SettingsHandler.SavedVariables.Style = numberStyle

        CALLBACK_MANAGER:FireCallbacks(TGT_STYLE_CHANGED)
    else
        _logger:logError("TGT_SettingsHandler.SetStyleSettings, invalid style " .. tostring(style))
    end
end

--[[
	Sets SetSoundSettings
]]--
function TGT_SettingsHandler.SetSoundSettings(index, sound)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_SettingsHandler.SetSoundSettings")
        _logger:logDebug("index, sound", index, sound)
    end

    TGT_SettingsHandler.SavedVariables.Sound = { index, sound }
end

--[[
	Sets StaticUltimateIDSettings and fires TGT_STATIC_ULTIMATE_ID_CHANGED callbacks
]]--
function TGT_SettingsHandler.SetStaticUltimateIDSettings(staticUltimateID)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_SettingsHandler.StaticUltimateIDSettings")
        _logger:logDebug("staticUltimateID", staticUltimateID)
    end

    TGT_SettingsHandler.SavedVariables.StaticUltimateID[GetUnitName("player")] = staticUltimateID

    CALLBACK_MANAGER:FireCallbacks(TGT_STATIC_ULTIMATE_ID_CHANGED, staticUltimateID)
end

--[[
	Gets StaticUltimateID
]]--
function TGT_SettingsHandler.GetStaticUltimateIDSettings()
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_SettingsHandler.GetStaticUltimateIDSettings")
    end

	foundUltimate = TGT_SettingsHandler.SavedVariables.StaticUltimateID[GetUnitName("player")]

	-- If not found, return default
	if (foundUltimate ~= nil) then
		return foundUltimate
	else
		return TGT_SettingsHandler.SavedVariables.StaticUltimateID["Default"]
	end
end

--[[
	Sets StaticUltimateIDSettings and fires TGT_SWIMLANE_ULTIMATE_GROUP_ID_CHANGED callbacks
]]--
function TGT_SettingsHandler.SetSwimlaneUltimateGroupIdSettings(swimlane, ultimateGroup)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_SettingsHandler.StaticUltimateIDSettings")
        _logger:logDebug("swimlane", swimlane)
        _logger:logDebug("ultimateGroup", ultimateGroup)
    end

    TGT_SettingsHandler.SavedVariables.SwimlaneUltimateGroupIds[swimlane] = ultimateGroup.GroupAbilityId

    CALLBACK_MANAGER:FireCallbacks(TGT_SWIMLANE_ULTIMATE_GROUP_ID_CHANGED, swimlane, ultimateGroup)
end

--[[
	Sets StaticUltimateIDSettings and fires TGT_SWIMLANE_ULTIMATE_GROUP_ID_CHANGED callbacks
]]--
function TGT_SettingsHandler.SetSwimlanesSettings(swimlanes)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_SettingsHandler.SetSwimlanesSettings")
        _logger:logDebug("swimlanes", swimlanes)
    end

    TGT_SettingsHandler.SavedVariables.Swimlanes = swimlanes

    CALLBACK_MANAGER:FireCallbacks(TGT_SWIMLANES_CHANGED, swimlanes)
end

--[[
	Sets MovableSettings and fires TGT_MOVABLE_CHANGED callbacks
]]--
function TGT_SettingsHandler.SetMovableSettings(movable)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_SettingsHandler.SetMovableSettings")
        _logger:logDebug("movable", movable)
    end

    TGT_SettingsHandler.SavedVariables.Movable = movable

    CALLBACK_MANAGER:FireCallbacks(TGT_MOVABLE_CHANGED, movable)
end

--[[
	Sets SwimlaneScalingSettings and fires TGT_SWIMLANE_SCALING_CHANGED callbacks
]]--
function TGT_SettingsHandler.SetSwimlaneScalingSettings(scaling)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_SettingsHandler.SetMovableSettings")
        _logger:logDebug("scaling", scaling)
    end

    TGT_SettingsHandler.SavedVariables.SwimlaneScaling = scaling

    CALLBACK_MANAGER:FireCallbacks(TGT_SWIMLANE_SCALING_CHANGED, scaling)
end

--[[
	Sets OnlyAvaSettings and fires TGT_IS_ZONE_CHANGED callbacks
]]--
function TGT_SettingsHandler.SetOnlyAvaSettings(onlyAva)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_SettingsHandler.SetOnlyAvaSettings")
        _logger:logDebug("onlyAva", onlyAva)
    end

    TGT_SettingsHandler.SavedVariables.OnlyAva = onlyAva

    CALLBACK_MANAGER:FireCallbacks(TGT_IS_ZONE_CHANGED)
end

--[[
	Sets VisibleOffsetSettings and fires TGT_VISIBLE_OFFSET_CHANGED callbacks
]]--
function TGT_SettingsHandler.SetVisibleOffsetSettings(visibleOffset)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_SettingsHandler.SetVisibleOffsetSettings")
        _logger:logDebug("visibleOffset", visibleOffset)
    end

    TGT_SettingsHandler.SavedVariables.VisibleOffset = visibleOffset

    CALLBACK_MANAGER:FireCallbacks(TGT_VISIBLE_OFFSET_CHANGED)
end

--[[
	Sets IsSortingActiveSettings settings
]]--
function TGT_SettingsHandler.SetIsSortingActiveSettings(isSortingActive)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_SettingsHandler.SetIsSortingActiveSettings")
        _logger:logDebug("isSortingActive", isSortingActive)
    end

    TGT_SettingsHandler.SavedVariables.IsSortingActive = isSortingActive
end

--[[
	Gets SimpleList visible in connection with selected style
]]--
function TGT_SettingsHandler.IsSimpleListVisible()
    if (LOG_ACTIVE) then _logger:logTrace("TGT_SettingsHandler.IsSimpleListVisible") end
    if (TGT_SettingsHandler.SavedVariables ~= nil) then
        if (LOG_ACTIVE) then _logger:logDebug("style", TGT_SettingsHandler.SavedVariables.Style) end
        return tonumber(TGT_SettingsHandler.SavedVariables.Style) == 1 and TGT_SettingsHandler.IsControlsVisible()
    else
        _logger:logError("TGT_SettingsHandler.SavedVariables is nil")
        return false
    end
end

--[[
	Gets SwimlaneList visible in connection with selected style
]]--
function TGT_SettingsHandler.IsSwimlaneListVisible()
    if (LOG_ACTIVE) then _logger:logTrace("TGT_SettingsHandler.IsSwimlaneListVisible") end
    if (TGT_SettingsHandler.SavedVariables ~= nil) then
        if (LOG_ACTIVE) then _logger:logDebug("style", TGT_SettingsHandler.SavedVariables.Style) end
        return tonumber(TGT_SettingsHandler.SavedVariables.Style) == 2 and TGT_SettingsHandler.IsControlsVisible()
    else
        _logger:logError("TGT_SettingsHandler.SavedVariables is nil")
        return false
    end
end

--[[
	Gets CompactSwimlaneList visible in connection with selected style
]]--
function TGT_SettingsHandler.IsCompactSwimlaneListVisible()
    if (LOG_ACTIVE) then _logger:logTrace("TGT_SettingsHandler.IsCompactSwimlaneListVisible") end
    if (TGT_SettingsHandler.SavedVariables ~= nil) then
        if (LOG_ACTIVE) then _logger:logDebug("style", TGT_SettingsHandler.SavedVariables.Style) end
        return tonumber(TGT_SettingsHandler.SavedVariables.Style) == 3 and TGT_SettingsHandler.IsControlsVisible()
    else
        _logger:logError("TGT_SettingsHandler.SavedVariables is nil")
        return false
    end
end

--[[
	Gets CompactSwimlaneList visible in connection with selected style
]]--
function TGT_SettingsHandler.IsControlsVisible()
    if (LOG_ACTIVE) then _logger:logTrace("TGT_SettingsHandler.IsControlsVisible") end
    if (TGT_SettingsHandler.SavedVariables ~= nil) then
        if (LOG_ACTIVE) then _logger:logDebug("onlyAvA", TGT_SettingsHandler.SavedVariables.OnlyAva) end
        if (TGT_SettingsHandler.SavedVariables.OnlyAva) then
            _logger:logDebug("isPlayerInAvAWorld", IsPlayerInAvAWorld())
            return IsPlayerInAvAWorld()
        else
            return true
        end
    else
        _logger:logError("TGT_SettingsHandler.SavedVariables is nil")
        return false
    end
end

--[[
	OnPlayerActivated fires TGT_IS_ZONE_CHANGED callbacks
]]--
function TGT_SettingsHandler.OnPlayerActivated(eventCode)
    if (LOG_ACTIVE) then
        _logger:logTrace("TGT_SettingsHandler.OnPlayerActivated")
    end

    CALLBACK_MANAGER:FireCallbacks(TGT_IS_ZONE_CHANGED)
end

--[[
	Initialize loads SavedVariables
]]--
function TGT_SettingsHandler.Initialize(logger)
    if (LOG_ACTIVE) then logger:logTrace("TGT_SettingsHandler.Initialize") end

    _logger = logger

    TGT_SettingsHandler.SavedVariables = ZO_SavedVars:NewAccountWide(TGT_SettingsHandler.SettingsName, SETTINGS_VERSION, nil, TGT_DEFAULTS)

    -- Register
    EVENT_MANAGER:RegisterForEvent(TGT_SettingsHandler.Name, EVENT_PLAYER_ACTIVATED, TGT_SettingsHandler.OnPlayerActivated)
end