
local Details = 		_G.Details
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local _
local addonName, Details222 = ...
local C_Timer = C_Timer
local UnitName = UnitName

--On Details! Load load default keys into the main object
function Details222.LoadSavedVariables.DefaultProfile()
	for key, value in pairs(Details.default_profile) do
		if (type(value) == "table") then
			Details[key] = Details.CopyTable(value)
		else
			Details[key] = value
		end
	end
end

function Details222.LoadSavedVariables.CharacterData()
	local defaultCharacterData = Details.default_player_data
	local currentCharacterData = _detalhes_database

	--check if the player data exists, if not, load from default
	if (not currentCharacterData) then --NOT EXISTS
		currentCharacterData = Details.CopyTable(defaultCharacterData)
		--[[GLOBAL]] _detalhes_database = currentCharacterData
	end

	--verify if there's new data added to 'default_player_data' and copy it to the savedvariable table
	--do this up to a deepness level of 2, example: currentCharacterData[key][subKey] = any
	for key, value in pairs(defaultCharacterData) do
		if (currentCharacterData[key] == nil) then --the key doesn't exists, add it
			if (type(value) == "table") then
				currentCharacterData[key] = Details.CopyTable(defaultCharacterData[key])
			else
				currentCharacterData[key] = value
			end

		elseif (type(currentCharacterData[key]) == "table") then
			for subKey, subValue in pairs(defaultCharacterData[key]) do
				if (currentCharacterData[key][subKey] == nil) then
					if (type(subValue) == "table") then
						currentCharacterData[key][subKey] = Details.CopyTable(defaultCharacterData[key][subKey])
					else
						currentCharacterData[key][subKey] = subValue
					end
				end
			end
		end

		--copy the key from saved table to Details object
		if (type(value) == "table") then
			Details[key] = Details.CopyTable(currentCharacterData[key])
		else
			Details[key] = currentCharacterData[key]
		end
	end
end

--check if this is a first run, reset, or just load the saved data.
function Details222.LoadSavedVariables.SharedData()
	local defaultAccountData = Details.default_global_data
	local currentAccountData = _detalhes_global

	if (not currentAccountData) then
		currentAccountData = Details.CopyTable(defaultAccountData)
		--[[GLOBAL]] _detalhes_global = currentAccountData
	end

	for key, value in pairs(defaultAccountData) do
		if (currentAccountData[key] == nil) then
			if (type(value) == "table") then
				currentAccountData[key] = Details.CopyTable(defaultAccountData[key])
			else
				currentAccountData[key] = value
			end

		elseif (type(currentAccountData[key]) == "table") then
			if (key == "always_use_profile_name") then
				currentAccountData["always_use_profile_name"] = ""
			end

			if (type(currentAccountData[key]) == "table") then
				for subKey, subValue in pairs(defaultAccountData[key]) do
					if (currentAccountData[key][subKey] == nil) then
						if (type(subValue) == "table") then
							currentAccountData[key][subKey] = Details.CopyTable(defaultAccountData[key][subKey])
						else
							currentAccountData[key][subKey] = subValue
						end
					end
				end
			end
		end

		--copy the key from savedvariables to Details object
		if (type(value) == "table") then
			Details[key] = Details.CopyTable(currentAccountData[key])
		else
			Details[key] = currentAccountData[key]
		end
	end
end

--load previous saved combat data
function Details222.LoadSavedVariables.CombatSegments()
	--this is the table where the character data is saved as well the combat data
	local currentCharacterData = _G["_detalhes_database"] --no need to check if it exists, it's already checked
	if (currentCharacterData == nil) then
		currentCharacterData = {}
	end

	--custom displays - if there's no saved custom display, they will be filled from the StartMeUp() when a new version is installed
	if (_detalhes_global.custom) then
		Details.custom = _detalhes_global.custom
		Details.refresh:r_atributo_custom()
	end

	local bShouldClearAndExit = not currentCharacterData.tabela_historico

	--check integrity of the sub table 'tabelas' and its first index 'current segment'
	if (not bShouldClearAndExit) then
		if (not currentCharacterData.tabela_historico.tabelas or not currentCharacterData.tabela_historico.tabelas[1]) then
			bShouldClearAndExit = true
		end
	end

	--check if is a major version upgrade (usualy API or low level changes)
	if (not bShouldClearAndExit) then
		bShouldClearAndExit = currentCharacterData.last_realversion and currentCharacterData.last_realversion < Details.realversion
	end

	--if can just clear all data and exit
	if (bShouldClearAndExit) then
		Details.tabela_historico = Details.historico:CreateNewSegmentDatabase()
		Details.tabela_overall = Details.combate:NovaTabela()
		Details.tabela_vigente = Details.combate:NovaTabela(_, Details.tabela_overall)
		Details222.PetContainer.Reset()
		Details222.BParser.WipeStoredSessionIds()

		if (currentCharacterData.saved_pet_cache) then
			Details:Destroy(currentCharacterData.saved_pet_cache) --saved pet data
			currentCharacterData.saved_pet_cache = nil
		end

		if (currentCharacterData.tabela_overall) then --saved overall data
			Details:Destroy(currentCharacterData.tabela_overall)
			currentCharacterData.tabela_overall = nil
		end

		if (currentCharacterData.tabela_historico) then
			Details:Destroy(currentCharacterData.tabela_historico)
			currentCharacterData.tabela_historico = nil
		end

		return
	else
		--pet owners cache saved on logout
		do
			Details222.PetContainer.Reset()
			if (currentCharacterData.saved_pet_cache) then
				--pet ownership table only exists if the player logoff inside a raid or dungeon
				Details222.PetContainer.SetPetData(currentCharacterData.saved_pet_cache)
				Details:Destroy(currentCharacterData.saved_pet_cache)
				currentCharacterData.saved_pet_cache = nil
			end
		end

		--restore saved overall data
		do
			if (currentCharacterData.tabela_overall) then
				Details.tabela_overall = Details.CopyTable(currentCharacterData.tabela_overall)
				Details:RestoreOverallMetatables()
			else
				Details.tabela_overall = Details.combate:NovaTabela()
				Details.tabela_overall.overall_refreshed = true
			end
		end

		--restore saved segments
		do
			Details.tabela_historico = Details.CopyTable(currentCharacterData.tabela_historico)
			Details:Destroy(currentCharacterData.tabela_historico)
			currentCharacterData.tabela_historico = nil
		end

		--get the first segment saved and use it as current segment
		Details.tabela_vigente = Details.tabela_historico.tabelas[1] --only low level access to this table allowed

		--need refresh for all containers
		for _, actorContainer in ipairs(Details.tabela_overall) do
			actorContainer.need_refresh = true
		end
		for _, actorContainer in ipairs(Details.tabela_vigente) do
			actorContainer.need_refresh = true
		end

		Details:RestoreMetatables()
	end
end

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

function Details:LoadConfig()

	--plugins data
		Details.plugin_database = _detalhes_database.plugin_database or {}

	--startup

		--set the nicktag cache host
			Details:NickTagSetCache (_detalhes_database.nick_tag_cache)

		--count data
			Details:CountDataOnLoad()

		--solo e raid plugin
			if (_detalhes_database.SoloTablesSaved) then
				if (_detalhes_database.SoloTablesSaved.Mode) then
					Details.SoloTables.Mode = _detalhes_database.SoloTablesSaved.Mode
					Details.SoloTables.LastSelected = _detalhes_database.SoloTablesSaved.LastSelected
				else
					Details.SoloTables.Mode = 1
				end
			end

		--switch tables
			Details.switch.slots = _detalhes_global.switchSaved.slots
			Details.switch.table = _detalhes_global.switchSaved.table

			if (Details.switch.table) then
				for i = 1, #Details.switch.table do
					if (not Details.switch.table [i]) then
						Details.switch.table [i] = {}
					end
				end
			end

		--last boss
			Details.last_encounter = _detalhes_database.last_encounter

		--buffs
			Details.savedbuffs = _detalhes_database.savedbuffs
			Details.Buffs:BuildTables()

		--initialize parser
			Details.capture_current = {}
			for captureType, captureValue in pairs(Details.capture_real) do
				Details.capture_current [captureType] = captureValue
			end

		--row animations
			Details:SetUseAnimations()

		--initialize spell cache
			Details:ClearSpellCache()

		--version first run
			if (not _detalhes_database.last_version or _detalhes_database.last_version ~= Details.userversion) then
				Details.is_version_first_run = true
			end

	--profile

		local unitname = UnitName ("player")

		--fix for old versions
		if (type(Details.always_use_profile) == "string") then
			Details.always_use_profile = false
			Details.always_use_profile_name = ""
		end

		if (type(Details.always_use_profile_name) ~= "string") then
			Details.always_use_profile = false
			Details.always_use_profile_name = ""
		end

		--check for "always use this profile"
			if (Details.always_use_profile and not Details.always_use_profile_exception [unitname]) then
				local profile_name = Details.always_use_profile_name
				if (profile_name and profile_name ~= "" and Details:GetProfile (profile_name)) then
					_detalhes_database.active_profile = profile_name
				end
			end

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

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

		--instances
			Details.tabela_instancias = _detalhes_database.tabela_instancias or {}

			--fix for version 1.21.0
			if (#Details.tabela_instancias > 0) then --only happens once after the character logon
				for index, saved_skin in ipairs(profile.instances) do
					local instance = Details.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 (Details.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 Details:ListInstances() do
					Details.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 (Details.local_instances_config [index].isLocked == nil) then
						Details.local_instances_config [index].isLocked = false
					end
				end

				Details.tabela_instancias = {}
			end

		--apply the profile
		Details:ApplyProfile(current_profile_name, true)
end

--On Details! Load count logons, tutorials, etc
function Details:CountDataOnLoad()
	--basic
	if (not _detalhes_global.got_first_run) then
		Details.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