ActivityTextureManager = class("ActivityTextureManager")
autoImport("IOPathConfig")
function ActivityTextureManager.Instance()
	if nil == ActivityTextureManager.me then
		ActivityTextureManager.me = ActivityTextureManager.new()
	end
	return ActivityTextureManager.me
end

function ActivityTextureManager:ctor()
	if(self.toBeDownload)then
		TableUtility.ArrayClear(self.toBeDownload)
	end
	self.toBeDownload = {}
	self.logEnable = false
	self.isDownloading = false
	self:initDownloadDir()
end

function ActivityTextureManager:log( ... )
	-- body
	if(self.logEnable)then
		helplog(...)
	end
end

--test
function ActivityTextureManager:GetLocalTempFilePath(picUrl)
	local fileName = self:GetFileName(picUrl)
	if(not fileName)then
		return 
	end
	return self:GetLocalTempRootPath() .. '/' .. fileName
end

function ActivityTextureManager:GetLocalPathByUrl(picUrl)
	local fileName = self:GetFileName(picUrl)
	if(not fileName)then
		return 
	end
	return self:GetLocalDownFilePath() .. '/' .. fileName
end

function ActivityTextureManager:GetFileName( picUrl )
	-- body
	local fileName = string.match(picUrl, ".+/([^/]*%.%w+)$")
	return fileName
end

function ActivityTextureManager:GetLocalTempRootPath(  )
	-- body
	return ApplicationHelper.persistentDataPath .. '/' .. "TempUsedToDownloadActivityPic"
end

function ActivityTextureManager:GetLocalDownFilePath()
	-- body
	return IOPathConfig.Paths.PUBLICPIC.ActivityPicture
end

function ActivityTextureManager:initDownloadDir(  )
	-- body
	local rootPath = self:GetLocalTempRootPath()
	if not FileHelper.ExistDirectory(rootPath) then
		FileHelper.CreateDirectory(rootPath)
	end
	-- rootPath = self:GetLocalDownFilePath()
	-- if not FileHelper.ExistDirectory(rootPath) then
	-- 	FileHelper.CreateDirectory(rootPath)
	-- end
end

function ActivityTextureManager:checkFileMd5(picUrl,bytes)
	local fileName = string.match(picUrl, ".+/([^/]*)%.%w+$")
	local md5Str = MyMD5.HashBytes(bytes)
	-- self:log("checkFileMd5:",md5Str,fileName)
	if(fileName and fileName == md5Str)then
		return true
	end
end

function ActivityTextureManager:tryGetActivityPicFromRemote(picUrl)
	self:log("ActivityTextureManager:tryGetActivityPicFromRemote start!!!",picUrl)
	self.isDownloading = true	
	local tempPath = self:GetLocalTempFilePath(picUrl)
	if(tempPath)then
		if FileHelper.ExistFile(tempPath) then
			FileHelper.DeleteFile(tempPath)
		end
		local localPath = self:GetLocalPathByUrl(picUrl)
		if(not localPath)then
			helplog("nil local path")
			return 
		end
		if not BackwardCompatibilityUtil.CompatibilityMode(BackwardCompatibilityUtil.V13) then
			local taskRecordID = CloudFile.CloudFileManager.Ins:Download(picUrl, tempPath, false,
			function ( progress )
				-- body
				self:ActivityPicProgressCallback(picUrl,progress)
			end ,function (  )
				-- body
				local bytes = FileHelper.LoadFile(tempPath)
				FileHelper.DeleteFile(tempPath)
				if(self:checkFileMd5(picUrl,bytes))then
					local currentTime = ServerTime.CurServerTime()
					currentTime = math.floor(currentTime / 1000)
					DiskFileManager.Instance:SaveFile(localPath, bytes, currentTime)
					self:ActivityPicCompleteCallback(picUrl,bytes)
				else
					self:ActivityPicErrorCallback(picUrl,"md5 check error!")
				end
			end, function ( errorMessage )
				-- body
				if FileHelper.ExistFile(tempPath) then
					FileHelper.DeleteFile(tempPath)
				end
				self:ActivityPicErrorCallback(picUrl,errorMessage)
			end, nil)
		else
			local taskRecordID = CloudFile.CloudFileManager.Ins:Download(picUrl, tempPath, false,
			function ( progress )
				-- body
				self:ActivityPicProgressCallback(picUrl,progress)
			end ,function (  )
				-- body
				local bytes = FileHelper.LoadFile(tempPath)
				FileHelper.DeleteFile(tempPath)
				local currentTime = ServerTime.CurServerTime()
				currentTime = math.floor(currentTime / 1000)
				DiskFileManager.Instance:SaveFile(localPath, bytes, currentTime)
				self:ActivityPicCompleteCallback(picUrl,bytes)
			end, function ( errorMessage )
				-- body
				if FileHelper.ExistFile(tempPath) then
					FileHelper.DeleteFile(tempPath)
				end
				self:ActivityPicErrorCallback(picUrl,errorMessage)
			end)
		end
	end
end

--from local
function ActivityTextureManager:getActivityPicFromLocal( picUrl)
	-- body
	local localPath = self:GetLocalPathByUrl(picUrl)
	-- self:log("ActivityTextureManager:getActivityPicFromLocal:",localPath)
	if(localPath)then
		local currentTime = ServerTime.CurServerTime()
		currentTime = math.floor(currentTime / 1000)
		local bytes = DiskFileManager.Instance:LoadFile(localPath, currentTime)
		if(self:checkFileMd5(picUrl,bytes))then
			return bytes
		else
			localPath = ApplicationHelper.persistentDataPath .. '/' .. localPath
			FileHelper.DeleteFile(localPath)
		end
	end
end

function ActivityTextureManager:AddActivityPicInfos(list)
	if(list and #list > 0)then
		for i=1,#list do
			self:AddSingleActivityPicInfo(list[i])
		end
		if(not self.isDownloading)then
			self:startTryGetActivityPic()
		end
	end
end

function ActivityTextureManager:AddSingleActivityPicInfo(picUrl)
	
   local bytes = self:getActivityPicFromLocal(picUrl)
   if(not bytes)then
   		local hasIn = self:HasInToBeDownload(picUrl)
	   	if(not hasIn)then
	   		self.toBeDownload[#self.toBeDownload+1] = picUrl
	   	end
   else
   		self:ActivityPicCompleteCallback(picUrl,bytes)
   end
end

function ActivityTextureManager:HasInToBeDownload(picUrl)
	for i=1,#self.toBeDownload do
		local single = self.toBeDownload[i]
		if(single == picUrl)then
			return true
		end
	end
end

function ActivityTextureManager:startTryGetActivityPic()
	if(#self.toBeDownload > 0)then
		self:tryGetActivityPicFromRemote(self.toBeDownload[1])
	end
end

function ActivityTextureManager:removeDownloadTexture(picUrl)
	for j=1,#self.toBeDownload do
		local data = self.toBeDownload[j]
		if(picUrl == picUrl)then
			table.remove(self.toBeDownload,j)
			break
		end
	end
end

ActivityTextureManager.ActivityPicProgressCallbackMsg = "ActivityTextureManager_ActivityPicProgressCallbackMsg"
ActivityTextureManager.ActivityPicCompleteCallbackMsg = "ActivityTextureManager_ActivityPicCompleteCallbackMsg"
ActivityTextureManager.ActivityPicErrorCallbackMsg = "ActivityTextureManager_ActivityPicErrorCallbackMsg"

--download thumbnail
function ActivityTextureManager:ActivityPicProgressCallback(picUrl,progress )
	-- body
	self:log("ActivityPicProgressCallback",picUrl,progress)
	GameFacade.Instance:sendNotification(ActivityTextureManager.ActivityPicProgressCallbackMsg,{picUrl = picUrl,progress = progress})
end

function ActivityTextureManager:ActivityPicCompleteCallback(picUrl,bytes)
	-- body
	self:log("ActivityPicCompleteCallback",picUrl,tostring(bytes))
	 self.isDownloading = false
	self:removeDownloadTexture(picUrl)
	self:startTryGetActivityPic()
	GameFacade.Instance:sendNotification(ActivityTextureManager.ActivityPicCompleteCallbackMsg,{picUrl = picUrl,byte = bytes})
end

function ActivityTextureManager:ActivityPicErrorCallback(picUrl,errorMessage)
	-- body
	self:log("ActivityPicErrorCallback",picUrl,errorMessage)
	 self.isDownloading = false
	self:removeDownloadTexture(picUrl)
	self:startTryGetActivityPic()
	GameFacade.Instance:sendNotification(ActivityTextureManager.ActivityPicErrorCallbackMsg,{picUrl = picUrl})
end