local ToastManager = class("ToastManager", BaseModule)

local TOAST_DURATION = 0.5
local TOAST_DEFAULT_SIZE_Y = 54
local TOAST_DEFAULT_FONT_SIZE = 30
local TOAST_BATTLE_SIZE_Y = 124
local TOAST_BATTLE_FONT_SIZE = 30

function ToastManager:ctor()
	self.curIndex = 0
	self.toastList = {}
end

function ToastManager:clear()
	self.curIndex = 0
	self.toastList = {}
end

function ToastManager:showToast(params)
	if self.curIndex >= #self.toastList then
		self.toastList = {}
		self.curIndex = 0
	end
	table.insert(self.toastList, params)

	if not self.toastSid then
		self:_doImmediately()
		self.toastSid = self:scheduleGlobal(function()
			self:_doImmediately()

			if self.curIndex >= #self.toastList then
				self:pauseScheduleGlobal(self.toastSid)
				self.toastSidPaused = true
			end
		end, TOAST_DURATION)
	else
		if self.toastSidPaused then
			self:_doImmediately()
		end
		self.toastSidPaused = false
		self:resumeScheduleGlobal(self.toastSid)
	end
end

function ToastManager:_doImmediately()
	local curIndex = self.curIndex + 1
	if not self.toastList[curIndex] then
		return
	end
	self.curIndex = curIndex
	local curParams = self.toastList[self.curIndex]
	self:_showToast(curParams)
end

function ToastManager:_showToast(params)
	UIManager:getToast(function(prefabObject)
		prefabObject._using = true
		if prefabObject._toastSequence then
			prefabObject._toastSequence:Kill()
			prefabObject._toastSequence = nil
		end

		local childMap = prefabObject:genAllChildren()
		local content = childMap["toast.content"]
		local icon = childMap["toast.icon"]
		local gotTx = childMap["toast.got_tx"]
		local numTx = childMap["toast.num_tx"]
		local cellWidth = 46
		if type(params) == "table" and params.id then
			content:setVisible(false)
			gotTx:setVisible(true)
			numTx:setVisible(true)
			icon:setVisible(true)

			gotTx:setText(I18N:getGlobalText(I18N.GlobalConst.GET))
			local cfg = ConfigManager:getConfig("item")[params.id]
			numTx:setText(params.str or "")
			if params.type == GConst.REWARD_TYPE.ITEM then
				icon:setSprite(GFunc.getIconRes(params.id))
			elseif params.type == GConst.REWARD_TYPE.EQUIP then
				icon:setSprite(GFunc.getEquipIconRes(params.id))
			elseif params.type == GConst.REWARD_TYPE.JEWELRY then
				icon:setSprite(GFunc.getJewelryIconRes(params.id))
			end
			local meshProComp = numTx:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT_MESH_PRO)
			local gotMeshProComp = gotTx:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT_MESH_PRO)
			local contentWidth = meshProComp.preferredWidth
			local gotWidth = gotMeshProComp.preferredWidth
			gotTx:setAnchoredPositionX(-(contentWidth + cellWidth)*0.5)
			icon:setAnchoredPositionX(-(contentWidth - gotWidth)*0.5)
			numTx:setAnchoredPositionX((gotWidth + cellWidth)*0.5)
		elseif type(params) == "table" and params.battleToast then
			content:setVisible(true)
			gotTx:setVisible(false)
			numTx:setVisible(false)
			icon:setVisible(false)
			content:setText(params.content)
			local meshProComp = content:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT_MESH_PRO)
			meshProComp.fontSize = TOAST_BATTLE_FONT_SIZE
			if meshProComp.preferredHeight > 100 then
				prefabObject:setSizeDeltaY(meshProComp.preferredHeight + 22)
			else
				prefabObject:setSizeDeltaY(TOAST_BATTLE_SIZE_Y)
			end
		else
			content:setVisible(true)
			gotTx:setVisible(false)
			numTx:setVisible(false)
			icon:setVisible(false)
			content:setText(params)
			local meshProComp = content:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_TEXT_MESH_PRO)
			meshProComp.fontSize = TOAST_DEFAULT_FONT_SIZE
			if meshProComp.preferredHeight > 40 then
				prefabObject:setSizeDeltaY(meshProComp.preferredHeight + 22)
			else
				prefabObject:setSizeDeltaY(TOAST_DEFAULT_SIZE_Y)
			end
		end

		prefabObject:setLocalPosition(0, 100, 0)
		prefabObject:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).enabled = true
		local canvasGroup = prefabObject:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS_GROUP)
		canvasGroup.alpha = 1

		prefabObject._toastSequence = prefabObject:createBindTweenSequence()
		local moveTween = prefabObject:getTransform():DOLocalMove(CS.UnityEngine.Vector3(0, 180, 0), 0.6)
		prefabObject._toastSequence:Append(moveTween)
		local fadeOutTween = canvasGroup:DOFade(0, 0.5)
		prefabObject._toastSequence:Append(fadeOutTween)
		prefabObject._toastSequence:OnComplete(function()
			prefabObject:getComponent(GConst.TYPEOF_UNITY_CLASS.CANVAS).enabled = false
			prefabObject._using = false
		end)
	end)
end

function ToastManager:refreshText()
	local list = UIManager:getAllToast()
	if list == nil then
		return
	end
	for _, toastObj in ipairs(list) do
		local childMap = toastObj:genAllChildren()
		childMap["toast.content"]:setText("")
		childMap["toast.got_tx"]:setText("")
	end
end

return ToastManager