	
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

	local _detalhes = 		_G._detalhes
	local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" )
	local _
	
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> On Details! Load:
	--> load default keys into the main object

function _detalhes:ApplyBasicKeys()

	--> we are not in debug mode
		self.debug = false
		
	--> connected to realm channel
		self.is_connected = false

	--> who is
		self.playername = UnitName ("player")
		self.playerserial = UnitGUID ("player")
		
	--> player faction and enemy faction
		self.faction = UnitFactionGroup ("player")
		if (self.faction == PLAYER_FACTION_GROUP[0]) then --> player is horde
			self.faction_against = PLAYER_FACTION_GROUP[1] --> ally
			self.faction_id = 0
		elseif (self.faction == PLAYER_FACTION_GROUP[1]) then --> player is alliance
			self.faction_against = PLAYER_FACTION_GROUP[0] --> horde
			self.faction_id = 1
		end
		
		self.zone_type = nil
		_detalhes.temp_table1 = {}
		
	--> combat
		self.encounter = {}
		self.in_combat = false
		self.combat_id = 0

	--> instances (windows)
		self.solo = self.solo or nil 
		self.raid = self.raid or nil 
		self.opened_windows = 0
		
		self.default_texture = [[Interface\AddOns\Details\images\bar4]]
		self.default_texture_name = "Details D'ictum"

		self.class_coords_version = 1
		self.class_colors_version = 1
		
		self.school_colors = {
			[1] = {1.00, 1.00, 0.00},
			[2] = {1.00, 0.90, 0.50},
			[4] = {1.00, 0.50, 0.00},
			[8] = {0.30, 1.00, 0.30},
			[16] = {0.50, 1.00, 1.00},
			[32] = {0.50, 0.50, 1.00},
			[64] = {1.00, 0.50, 1.00},
			["unknown"] = {0.5, 0.75, 0.75, 1}
		}
		
	--> load default profile keys
		for key, value in pairs (_detalhes.default_profile) do 
			if (type (value) == "table") then
				local ctable = Details.CopyTable (value)
				self [key] = ctable
			else
				self [key] = value
			end
		end
	
	--> end
		return true

end

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> On Details! Load:
	--> check if this is a first run, reset, or just load the saved data.

function _detalhes:LoadGlobalAndCharacterData()

	--> check and build the default container for character database
	
		--> it exists?
		if (not _detalhes_database) then
			_detalhes_database = Details.CopyTable (_detalhes.default_player_data)
		end

		--> load saved values
		for key, value in pairs (_detalhes.default_player_data) do
		
			--> check if key exists, e.g. a new key was added
			if (_detalhes_database [key] == nil) then
				if (type (value) == "table") then
					_detalhes_database [key] = Details.CopyTable (_detalhes.default_player_data [key])
				else
					_detalhes_database [key] = value
				end
				
			elseif (type (_detalhes_database [key]) == "table") then
				if (type(_detalhes.default_player_data [key]) == "string") then
					print("|cFFFFAA00Details!|r error 0x8538, report on discord", key, _detalhes_database [key], _detalhes.default_player_data [key])
				end
				for key2, value2 in pairs (_detalhes.default_player_data [key]) do
					if (_detalhes_database [key] [key2] == nil) then
						if (type (value2) == "table") then
							_detalhes_database [key] [key2] = Details.CopyTable (_detalhes.default_player_data [key] [key2])
						else
							_detalhes_database [key] [key2] = value2
						end
					end
				end
			end
			
			--> copy the key from saved table to details object
			if (type (value) == "table") then
				_detalhes [key] = Details.CopyTable (_detalhes_database [key])
			else
				_detalhes [key] = _detalhes_database [key]
			end
			
		end
	
	--> check and build the default container for account database
		if (not _detalhes_global) then
			_detalhes_global = Details.CopyTable (_detalhes.default_global_data)
		end
		
		for key, value in pairs (_detalhes.default_global_data) do 
		
			--> check if key exists
			if (_detalhes_global [key] == nil) then
				if (type (value) == "table") then
					_detalhes_global [key] = Details.CopyTable (_detalhes.default_global_data [key])
				else
					_detalhes_global [key] = value
				end
				
			elseif (type (_detalhes_global [key]) == "table") then

				if (type(_detalhes.default_global_data [key]) == "string") then
					C_Timer.After(5, function()
						print("|cFFFFAA00Details!|r error 0x8547, report on discord", key, _detalhes_global [key], _detalhes.default_global_data [key])
					end)
				end

				if (key == "always_use_profile_name") then
					_detalhes_global ["always_use_profile_name"] = ""
				end

				if (type (_detalhes_global [key]) == "table") then
					for key2, value2 in pairs (_detalhes.default_global_data [key]) do
						if (_detalhes_global [key] [key2] == nil) then
							if (type (value2) == "table") then
								_detalhes_global [key] [key2] = Details.CopyTable (_detalhes.default_global_data [key] [key2])
							else
								_detalhes_global [key] [key2] = value2
							end
						end
					end
				end
			end
			
			--> copy the key from saved table to details object
			if (type (value) == "table") then
				_detalhes [key] = Details.CopyTable (_detalhes_global [key])
			else
				_detalhes [key] = _detalhes_global [key]
			end

		end
		
	--> end
		return true
end

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> On Details! Load:
	--> load previous saved combat data

function _detalhes:LoadCombatTables()

	--> if isn't nothing saved, build a new one
		if (not _detalhes_database.tabela_historico) then
			_detalhes.tabela_historico = _detalhes.historico:NovoHistorico()
			_detalhes.tabela_overall = _detalhes.combate:NovaTabela()
			_detalhes.tabela_vigente = _detalhes.combate:NovaTabela (_, _detalhes.tabela_overall)
			_detalhes.tabela_pets = _detalhes.container_pets:NovoContainer()
			_detalhes:UpdateContainerCombatentes()
		else

			--> build basic containers
				-- segments
				_detalhes.tabela_historico = _detalhes_database.tabela_historico or _detalhes.historico:NovoHistorico()
				-- overall
				_detalhes.tabela_overall = _detalhes.combate:NovaTabela()
				
				-- pets
				_detalhes.tabela_pets = _detalhes.container_pets:NovoContainer()
				if (_detalhes_database.tabela_pets) then
					_detalhes.tabela_pets.pets = Details.CopyTable (_detalhes_database.tabela_pets)
				end
				_detalhes:UpdateContainerCombatentes()
				
			--> if the core revision was incremented, reset all combat data
				if (_detalhes_database.last_realversion and _detalhes_database.last_realversion < _detalhes.realversion) then
					--> details was been hard upgraded
					_detalhes.tabela_historico = _detalhes.historico:NovoHistorico()
					_detalhes.tabela_overall = _detalhes.combate:NovaTabela()
					_detalhes.tabela_vigente = _detalhes.combate:NovaTabela (_, _detalhes.tabela_overall)
					_detalhes.tabela_pets = _detalhes.container_pets:NovoContainer()
					_detalhes:UpdateContainerCombatentes()
					
					_detalhes_database.tabela_historico = nil
					_detalhes_database.tabela_overall = nil
				else
					--> check integrity
					local combat = _detalhes.tabela_historico.tabelas [1]
					if (combat) then
						if (not combat[1] or not combat[2] or not combat[3] or not combat[4]) then
							--> something went wrong in last logon, let's just reset and we are good to go
							_detalhes.tabela_historico = _detalhes.historico:NovoHistorico()
							_detalhes.tabela_vigente = _detalhes.combate:NovaTabela (_, _detalhes.tabela_overall)
							_detalhes.tabela_pets = _detalhes.container_pets:NovoContainer()
							_detalhes:UpdateContainerCombatentes()
						end
					end
				end

				if (not _detalhes.overall_clear_logout) then
					if (_detalhes_database.tabela_overall) then
						_detalhes.tabela_overall = _detalhes_database.tabela_overall
						_detalhes:RestauraOverallMetaTables()
					end
				else
					_detalhes.tabela_overall = _detalhes.combate:NovaTabela()
				end
				
			--> re-build all indexes and metatables
				_detalhes:RestauraMetaTables()

			--> get last combat table
				local historico_UM = _detalhes.tabela_historico.tabelas[1]
				
				if (historico_UM) then
					_detalhes.tabela_vigente = historico_UM --> significa que elas eram a mesma tabela, ent�o aqui elas se tornam a mesma tabela
				else
					_detalhes.tabela_vigente = _detalhes.combate:NovaTabela (_, _detalhes.tabela_overall)
				end
				
			--> need refresh for all containers
				for _, container in ipairs (_detalhes.tabela_overall) do 
					container.need_refresh = true
				end
				for _, container in ipairs (_detalhes.tabela_vigente) do 
					container.need_refresh = true
				end
			
			--> erase combat data from the database
				_detalhes_database.tabela_vigente = nil
				_detalhes_database.tabela_historico = nil
				_detalhes_database.tabela_pets = nil
				
				-- double check for pet container
				if (not _detalhes.tabela_pets or not _detalhes.tabela_pets.pets) then
					_detalhes.tabela_pets = _detalhes.container_pets:NovoContainer()
				end
				_detalhes:UpdateContainerCombatentes()
		
		end
end

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> On Details! Load:
	--> load the saved config on the addon

function _detalhes:LoadConfig()

	--> plugins data
		_detalhes.plugin_database = _detalhes_database.plugin_database or {}

	--> startup
	
		--> set the nicktag cache host
			_detalhes:NickTagSetCache (_detalhes_database.nick_tag_cache)
			
		--> count data
			_detalhes:CountDataOnLoad()
			
		--> solo e raid plugin
			if (_detalhes_database.SoloTablesSaved) then
				if (_detalhes_database.SoloTablesSaved.Mode) then
					_detalhes.SoloTables.Mode = _detalhes_database.SoloTablesSaved.Mode
					_detalhes.SoloTables.LastSelected = _detalhes_database.SoloTablesSaved.LastSelected
				else
					_detalhes.SoloTables.Mode = 1
				end
			end
			
		--> switch tables
			_detalhes.switch.slots = _detalhes_global.switchSaved.slots
			_detalhes.switch.table = _detalhes_global.switchSaved.table
		
			if (_detalhes.switch.table) then
				for i = 1, #_detalhes.switch.table do
					if (not _detalhes.switch.table [i]) then
						_detalhes.switch.table [i] = {}
					end
				end
			end
		
		--> last boss
			_detalhes.last_encounter = _detalhes_database.last_encounter
		
		--> buffs
			_detalhes.savedbuffs = _detalhes_database.savedbuffs
			_detalhes.Buffs:BuildTables()
			
		--> initialize parser
			_detalhes.capture_current = {}
			for captureType, captureValue in pairs (_detalhes.capture_real) do 
				_detalhes.capture_current [captureType] = captureValue
			end
			
		--> row animations
			_detalhes:SetUseAnimations()
			
		--> initialize spell cache
			_detalhes:ClearSpellCache() 
			
		--> version first run
			if (not _detalhes_database.last_version or _detalhes_database.last_version ~= _detalhes.userversion) then
				_detalhes.is_version_first_run = true
			end
			--_detalhes.is_version_first_run = true
			--_detalhes_database.last_realversion = 126
			
	--> profile
	
		local unitname = UnitName ("player")
	
		--> fix for old versions
		if (type (_detalhes.always_use_profile) == "string") then
			_detalhes.always_use_profile = false
			_detalhes.always_use_profile_name = ""
		end

		if (type (_detalhes.always_use_profile_name) ~= "string") then
			_detalhes.always_use_profile = false
			_detalhes.always_use_profile_name = ""
		end
		
		--> check for "always use this profile"
			if (_detalhes.always_use_profile and not _detalhes.always_use_profile_exception [unitname]) then
				local profile_name = _detalhes.always_use_profile_name
				if (profile_name and profile_name ~= "" and _detalhes:GetProfile (profile_name)) then
					_detalhes_database.active_profile = profile_name
				end
			end
		
		--> old version
		--	if (_detalhes.always_use_profile and type (_detalhes.always_use_profile) == "string") then
		--		_detalhes_database.active_profile = _detalhes.always_use_profile
		--	end

		--> character first run
			if (_detalhes_database.active_profile == "") then
				_detalhes.character_first_run = true
				--> � a primeira vez que este character usa profiles,  precisa copiar as keys existentes
				local current_profile_name = _detalhes:GetCurrentProfileName()
				_detalhes:GetProfile (current_profile_name, true)
				_detalhes:SaveProfileSpecial()
			end

		--> load profile and active instances
			local current_profile_name = _detalhes:GetCurrentProfileName()
		--> check if exists, if not, create one
			local profile = _detalhes:GetProfile (current_profile_name, true)

		--> instances
			_detalhes.tabela_instancias = _detalhes_database.tabela_instancias or {}
			--so if the instances are loaded, the taint happen
			--if I break the tabela_instancias the addon won't taint
			--if true then return end --if I return here, the addon taints

			--> fix for version 1.21.0
			if (#_detalhes.tabela_instancias > 0) then --> only happens once after the character logon
				--if (current_profile_name:find (UnitName ("player"))) then
					for index, saved_skin in ipairs (profile.instances) do
						local instance = _detalhes.tabela_instancias [index]
						if (instance) then
							saved_skin.__was_opened = instance.ativa
							saved_skin.__pos = Details.CopyTable (instance.posicao)
							saved_skin.__locked = instance.isLocked
							saved_skin.__snap = Details.CopyTable (instance.snap)
							saved_skin.__snapH = instance.horizontalSnap
							saved_skin.__snapV = instance.verticalSnap

							for key, value in pairs (instance) do
								if (_detalhes.instance_defaults [key] ~= nil) then
									if (type (value) == "table") then
										saved_skin [key] = Details.CopyTable (value)
									else
										saved_skin [key] = value
									end
								end
							end
						end
					end

					for index, instance in _detalhes:ListInstances() do
						_detalhes.local_instances_config [index] = {
							pos = Details.CopyTable (instance.posicao),
							is_open = instance.ativa,
							attribute = instance.atributo,
							sub_attribute = instance.sub_atributo,
							mode = instance.modo or 2,
							modo = instance.modo or 2,
							segment = instance.segmento,
							snap = Details.CopyTable (instance.snap),
							horizontalSnap = instance.horizontalSnap,
							verticalSnap = instance.verticalSnap,
							sub_atributo_last = instance.sub_atributo_last,
							isLocked = instance.isLocked
						}

						if (_detalhes.local_instances_config [index].isLocked == nil) then
							_detalhes.local_instances_config [index].isLocked = false
						end
					end
				--end

				_detalhes.tabela_instancias = {}
			end
			--_detalhes:ReativarInstancias()

		--> apply the profile
			_detalhes:ApplyProfile (current_profile_name, true)

		--> custom
			_detalhes.custom = _detalhes_global.custom
			_detalhes.refresh:r_atributo_custom()
end

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> On Details! Load:
	--> count logons, tutorials, etc

function _detalhes:CountDataOnLoad()
	
	--> basic
		if (not _detalhes_global.got_first_run) then
			_detalhes.is_first_run = true
		end
		
	--> tutorial
		self.tutorial = self.tutorial or {}
		
		self.tutorial.logons = self.tutorial.logons or 0
		self.tutorial.logons = self.tutorial.logons + 1
		
		self.tutorial.unlock_button = self.tutorial.unlock_button or 0
		self.tutorial.version_announce = self.tutorial.version_announce or 0
		self.tutorial.main_help_button = self.tutorial.main_help_button or 0
		self.tutorial.alert_frames = self.tutorial.alert_frames or {false, false, false, false, false, false}
		
		self.tutorial.main_help_button = self.tutorial.main_help_button + 1
		
		self.character_data = self.character_data or {logons = 0}
		self.character_data.logons = self.character_data.logons + 1

end
