
.namespace SaveManager

Options = 
{
	"LoopAndMusicVolume",
	"GeneralVolume",
}

g_oldoption = {}

GameDataArrays = 
{
	'Statistics',
	"SampleLevel", --TODO à renommer !
	'UserData',
}

ProfileDataArrays =
{
	'ProfilConfig',
	--'Options',
}

g_ProfileFilename = "Profils.lua"
g_currentFileName = ''
g_screenShotName = ''

ClassesToSave =
{
	InventoryObject = {"Equipped"},
}

SCALESCREENSHOTX = 0.275
SCALESCREENSHOTY = 0.286


SIZETOALLOCATE = 384 --3 * 128 car on a trois blocs alloué
NBFILESTOALLOCATE = 6 -- profils , 4 sauvegarde+le banner


NBPROFIL = 3
	
function OnEnable()
	
end


function GetSaveDirectory()
	return "save:/"	
	--return "c:/Tmp/" --TODO à remettre quand ce sera corrigé !!
end


function loadUnitState()
	local unitState = Array['UnitsState']
	local ut
	for className, units in pairs(unitState) do
		for unitName, attrArray in pairs(units) do
			ut = Load(unitName, className)
			for attr, val in pairs(attrArray) do
				ut[attr] = val
			end
		end
	end
	
end


--charge le ProfilConfig
--retourn faux si le fichier de profil n'existe pas (premiére partie)
function loadProfile()

	local filepath = GetSaveDirectory() .. g_ProfileFilename

	-- local res = OPFileManager.UnpadFile(filepath,"tmp:/tmp.lua")
	
	-- if (not res) then
		-- OPLog.Log("probléme de l'unpad de "..filepath)
		-- PopupManager.OpenPopup("NAND_07",self)
		-- return false
	-- end
	
	OPLog.Log("loadprofile "..filepath)
	Array = nil
	
	--todo récupérer code d'erreur sur wii
	OPLua.Include(filepath)
	
	if (Array == nil) then
		OPLog.Log("probléme au load du profil !")
		return false
	end
	
	loadDataArrays()
	
	return true
	
end


--on alloue les blocs
function AllocateBlock()
	--si on trouve pas de profils.lua on alloue les blocs
	local filepath = GetSaveDirectory() .. g_ProfileFilename
	
	OPLog.Log("find file de "..filepath)
	local tab = OPFileManager.FindFiles(filepath)
	

	
	if table.getn(tab) == 0 then --test Wii à virer sur la prochaine version
		OPLog.Log("pas de slot visible -> on crée les blocs "..GlobalFunctions.Display(tab))
		
		--TRC on vérifie la taille dispo
		if not OPFileManager.CheckWriteSpace("save:/",SIZETOALLOCATE,NBFILESTOALLOCATE) then
			OPLog.Log("prob au checkwrite space "..tostring(OPFileManager.GetLastError()))
			PopupManager.OpenPopup("NAND_02",self)
			return true
		end
		
		saveProfile()
		--on crée desbloc vide
		
		for i=1,NBPROFIL do
			local res = OPFileManager.PadFile("script/Inc/dummy","save:/Profil"..i..".lua",65536)
			if not res then
				OPLog.Log('prob lors de la création des blocs')
			end
		end
		return true
	else
		OPLog.Log("on ne crée pas les blocs ils existent déjà")
		return false
	end
	
end


--[[ Fonction qui charge la partie sauvée sous le fichier nommé "saveName" 
      - boolean 'copy' : true si l'on doit écraser la saugarde auto (lorsque l'on charge à partir du menu --]]
function loadGame(saveName, switchdirectly)

	SetVariables("CurrentlyLoadingGame",true)
	local oldmanager = GetVariables("currentNavManager")
	cleanGameBeforeLoading()
	g_saveName = saveName

	local filepath = GetSaveDirectory() .. g_saveName..".lua"
	
	OPLog.Log("filepath "..filepath)
	
	-- res = OPFileManager.UnpadFile(filepath,"tmp:/tmp.lua")
	
	-- if (not res) then
		-- OPLog.Log("probléme de l'unpad de "..filepath)
		-- PopupManager.OpenPopup("NAND_07",self)
		-- return false
	-- end
	
	Array = nil
	OPLua.Include(filepath)
	
	if (Array == nil) then
		AssertPopup(false,"prob lors de la lecture de la sauvegarde "..saveName)
		return false
	end
	
	initDataArrays()
	loadDataArrays()
	loadUnitState()
	
	if switchdirectly then
		local newmanager = ProfilConfig.Get(g_saveName.."_lastscreen")
		if unit(newmanager) ~= nil then
			NavigationManager.SwitchTo(nil,newmanager)
		else
			OPLog.Log("prob sur le newmanager "..tostring(newmanager))
		end
	end
	
	
	return true
		
end

function createNewGame()

	cleanGameBeforeLoading()
	initDataArrays()
	
end


--fonction à mettre en place au fur et à mesure
function cleanGameBeforeLoading()
	ApplyToClass("InventoryObject",UnEquippedObj)
end

function UnEquippedObj(ut)
	ut.Equipped = false
end


function getSavedManagerName()

	local info = Array['SavegameInfo']
	local mngName = info['Manager']
	return mngName

end


function initDataArrays()

	local t = OPTime.GetTime()
	
	for u,name in pairs (GameDataArrays) do
		unit(name).Reset()
	end
	
	--OPLog.Log("reset des variables du jeu, temps : "..OPTime.GetTime() - t)
	
end


function loadDataArrays()

	if Array ~= nil then
		local dataArrays = Array['DataArrays']
		for daName, daArray in pairs(dataArrays) do
			local da = Load(daName, 'DataArray')
			for key, value in pairs(daArray) do
				--OPLog.Log("on set  "..da.Name.." "..key.." à "..tostring(value))
				da.Set(key, value,true)
			end
		end
	end
	
end



--convertie les secondes au bon format pour l'affichage
function mySecAsTime(_sec)

	if (_sec == 0) then
		return 'N/A'
	end
	local sec = math.floor(_sec)
	local min = math.floor(sec / 60)
	sec = sec - (min * 60)
	local hour = math.floor(min / 60)
	min = min - (hour * 60)
	local day = math.floor(hour / 24)
	hour = hour - (day * 24)
	return day .. ' Jours, ' .. goodNumber(hour) .. 'h' .. goodNumber(min) .. 'm' .. goodNumber(sec)
	
end


function saveDataToFile(filepath, _slotNumber)

	local f = OPFileManager.Open(filepath, 'w')
	
	if (f == nil) then
		return false
	end
	
	f:Write('Array =\r{\r')
	


	f:Write(PrintDataArrays(GameDataArrays))
	f:Write(PrintUnitsState())
	
	f:Write('}\r\r')
	
	local res = f:Flush()
	f:Close()
	
	if res == false then
		OPLog.Log("save prob à l'écriture "..tostring(OPFileManager.GetLastError()))
		return false
	end
	
	
	--pas de pas pour le moment
	--on pad maintenant
	-- res = OPFileManager.PadFile("tmp:/tmp.lua",filepath,65536)
	
	-- if not res then
	--	todo mettre message TRC ensuite
		-- AssertPopup(false,"prob lors du padding de "..filepath)
	-- end	
	-- OPLog.Log(" saved file path : "..tostring(filepath))
	
end


function saveProfileDataToFile(filepath)

	--OPLog.Log("filepath profile "..filepath)
	local f ,str= OPFileManager.Open(filepath,'w')

	if (f == nil) then
		OPLog.Log("prob à l'ouverture du fichier "..filepath.." "..tostring(OPFileManager.GetLastError()))
		return false
	end	

	f:Write('Array ={')
	f:Write(PrintDataArrays(ProfileDataArrays))
	f:Write('}')
	local res = f:Flush()
	f:Close()
	
	if res == false then
		OPLog.Log("save prob à l'écriture "..tostring(OPFileManager.GetLastError()))
		return false
	end
	
	
	-- PLUS DE PADDING SUR PC POUR l'instant
	
	--on pad maintenant
	-- local res = OPFileManager.PadFile("tmp:/tmp.lua",filepath,4096)
	
	-- if not res then
		--todo mettre message TRC ensuite
		-- AssertPopup(false,"prob lors du padding de "..filepath)
	-- end	
	
	OPLog.Log(" saved profile path : "..tostring(filepath))
	
end




--rend le temps dans le format correct
function getCurrentTime()

	local dt = OPTime.GetLocalTime()
	local dtstring = ''
	dtstring = dtstring .. goodNumber(dt.day) .. '-' .. goodNumber(dt.month) .. '-' .. dt.year .. '_' .. goodNumber(dt.hour) .. 'h' .. goodNumber(dt.minute)
	return dtstring
	
end

function saveProfile()
	--CreateSaveDirectory()
	local userSaveDir = GetSaveDirectory()
	local createok = OPFileManager.CreateDirectory(userSaveDir,true)
	
	if createok == false then
		OPLog.Log("erreur lors de la création du repertoire ! "..tostring(userSaveDir).." "..tostring(createok).." "..tostring(OPFileManager.GetLastError()))
		return
	end
	local filepath = userSaveDir .. g_ProfileFilename
	return saveProfileDataToFile(filepath)
end

function SaveBanner()
		--on copie la banner
	AssertPopup(false, "pas d'actualités")
	local tab = OPFileManager.FindFiles("save:/banner.bin")
	--OPLog.Log(GlobalFunctions.Display(tab))
	--OPLog.Log("taille de tab "..table.getn(tab))
	if table.getn(tab) == 0 then
		local res = OPFileManager.CopyFile("media/banner.bin","save:/banner.bin")
		if res == false then
			OPLog.Log("prob lors de la copier du banner filer "..tostring(OPFileManager.GetLastError()))
		else
			OPLog.Log("copie banner.bin")
		end
	else
		OPLog.Log("pas besoin de copier le fichier banner.bin existe déjà")
	end
end

--[[ Fonction de sauvegarde du jeu : 
	Crée un fichier .lua de sauvegarde dans le repertoire du profil courant,
	nommé 'saveName', ou par défaut avec la fonction de nommage 'createNumberedSaveName()' --]]
function saveGame(saveName)

	AssertPopup(type(saveName) == "string" , "Erreur Params")
	
	--on doit appeler les deux indépendamment
	--saveProfile()
	
	local userSaveDir = GetSaveDirectory()
	
	--on crée le directory, c'est innofensif s'il n'existe pas tt de façon
	OPLog.Log("on sauvegarde  "..saveName)
	local createok = OPFileManager.CreateDirectory(userSaveDir,true)
	
	if createok == false then
		OPLog.Log("erreur lors de la création du repertoire ! "..tostring(userSaveDir).." "..tostring(createok).." "..OPFileManager.GetLastError())
		return
	end
	
	local filepath = userSaveDir .. saveName .. '.lua'
	g_currentFileName = saveName
	
	local res = saveDataToFile(filepath, _slotNumber)
	

	--SaveBanner()
	
	
	return res
	
end
