
local DF = _G ["DetailsFramework"]
local _

if (not DF or not DetailsFrameworkCanLoad) then
	return
end

--runs when the addon received addon_loaded
local addonPreLoad = function(addonFrame, event, ...)
	--check if the saved variables table is created, if not create one
	_G[addonFrame.__savedVarsName] = _G[addonFrame.__savedVarsName] or {}

	if (addonFrame.__savedVarsDefaultTemplate) then
		--load saved vars for this character
		DF.SavedVars.LoadSavedVarsForPlayer(addonFrame)
	end

	if (addonFrame.OnLoad) then
		DF:Dispatch(addonFrame.OnLoad, addonFrame, ...)
	end
end

--runs when the addon received player_login
local addonInit = function(addonFrame, event, ...)
	if (addonFrame.OnInit) then
		DF:Dispatch(addonFrame.OnInit, addonFrame, ...)
	end
end

--when the player logout or reloadUI
local addonUnload = function(addonFrame, event, ...)
	--close saved tables
	DF.SavedVars.CloseSavedTable(addonFrame.db)
end

local addonEvents = {
	["ADDON_LOADED"] = addonPreLoad,
	["PLAYER_LOGIN"] = addonInit,
	["PLAYER_LOGOUT"] = addonUnload,
}

local addonOnEvent = function(addonFrame, event, ...)
	local func = addonEvents[event]
	if (func) then
		func(addonFrame, event, ...)
	else
		--might be a registered event from the user
		if (addonFrame[event]) then
			DF:CoreDispatch(addonFrame.__name, addonFrame[event], addonFrame, event, ...)
		end
	end
end

local getAddonName = function(addonFrame)
	return addonFrame:GetName()
end

function DF:CreateNewAddOn(addonName, globalSavedVariablesName, savedVarsTemplate)
	local newAddon = CreateFrame("frame", addonName, UIParent)
	newAddon.__name = addonName
	newAddon.__savedVarsName = globalSavedVariablesName
	newAddon.__savedVarsDefaultTemplate = savedVarsTemplate

	newAddon.GetAddonName = getAddonName

	newAddon:RegisterEvent("ADDON_LOADED")
	newAddon:RegisterEvent("PLAYER_LOGIN")
	newAddon:RegisterEvent("PLAYER_LOGOUT")
	newAddon:SetScript("OnEvent", addonOnEvent)

	return newAddon
end




--old create addon
function DF:CreateAddOn (name, global_saved, global_table, options_table, broker)

	local addon = LibStub ("AceAddon-3.0"):NewAddon (name, "AceConsole-3.0", "AceEvent-3.0", "AceTimer-3.0", "DetailsFramework-1.0", "AceComm-3.0")
	_G [name] = addon
	addon.__name = name

	function addon:OnInitialize()

		if (global_saved) then
			if (broker and broker.Minimap and not global_table.Minimap) then
				DF:Msg (name, "broker.Minimap is true but no global.Minimap declared.")
			end
			self.db = LibStub ("AceDB-3.0"):New (global_saved, global_table or {}, true)
		end

		if (options_table) then
			LibStub ("AceConfig-3.0"):RegisterOptionsTable (name, options_table)
			addon.OptionsFrame1 = LibStub ("AceConfigDialog-3.0"):AddToBlizOptions (name, name)

			LibStub ("AceConfig-3.0"):RegisterOptionsTable (name .. "-Profiles", LibStub ("AceDBOptions-3.0"):GetOptionsTable (self.db))
			addon.OptionsFrame2 = LibStub ("AceConfigDialog-3.0"):AddToBlizOptions (name .. "-Profiles", "Profiles", name)
		end

		if (broker) then
			local broker_click_function = broker.OnClick
			if (not broker_click_function and options_table) then
				broker_click_function = function()
					InterfaceOptionsFrame_OpenToCategory (name)
					InterfaceOptionsFrame_OpenToCategory (name)
				end
			end

			local databroker = LibStub ("LibDataBroker-1.1"):NewDataObject (name, {
				type = broker.type or "launcher",
				icon = broker.icon or [[Interface\PvPRankBadges\PvPRank15]],
				text = broker.text or "",
				OnTooltipShow = broker.OnTooltipShow,
				OnClick = broker_click_function
			})

			if (databroker and broker.Minimap and global_table.Minimap) then
				LibStub ("LibDBIcon-1.0"):Register (name, databroker, addon.db.profile.Minimap)
			end
		end

		if (addon.OnInit) then
			xpcall (addon.OnInit, geterrorhandler(), addon)
		end
		
	end
	
	return addon
	
end
