local this = class("topBarManager", G_EventManagerBase)
local uiTopBarTpl = L_GameTpl:getUiTopBarTpl()
local topBarResPath = "UI/CommonPrefabs/commonTopBar.prefab"
local topBarNodePath = "UI/CommonPrefabs/commonTopBarNode.prefab"
local topBarMoudlePath = "ui.pages.common.modules.commonTopBar"

function this:getCurrentPageName()
  local curPage = L_UI:currentPage(L_UI.groupKeys.stack)
  return curPage
end

function this:playOpen(pageName)
  if self.curPageName == pageName then
    return
  end
  local options = self:getTopBarConfigData(pageName)
  if not options then
    return
  end
  local page = L_UI:getPage(pageName)
  if not page or not L_CommonUtil.isValid(page.gameObject) then
    return
  end
  self.curPageName = pageName
  self:setTopBar(options)
  self.topBarTrans:SetParent(page.gameObject.transform)
  if self.topBarModule ~= nil then
    self.topBarModule:playOpen()
  end
  if page.cls and page.cls.refreshTopBar ~= nil then
    page.cls:refreshTopBar()
  end
end

function this:onPagePreOpen(p)
  local pageName = self:getCurrentPageName()
  if not pageName then
    return
  end
  self:playOpen(pageName)
end

function this:onPageClosed(pageName)
  if self.curPageName ~= pageName then
    return
  end
  self.curPageName = nil
  self.topBarTrans:SetParent(self.rootTrans)
  self.topBarModule:playClose()
  self:disposeTimer()
  self.closeTimer = Timer.once(self.closeTime, function()
    self:onPagePreOpen()
    self.closeTimer = nil
  end, self)
end

function this:disposeTimer()
  if self.closeTimer ~= nil then
    Timer.remove(self.closeTimer)
    self.closeTimer = nil
  end
end

function this:initialize()
  self.closeTime = 0.12
  self.curRoot = nil
  local root = L_ResPool:syncGameObject(topBarNodePath, L_UI:getRoot())
  root.name = "[CommonTopBarNode]"
  self.rootTrans = root.transform
  self.topBar = L_ResPool:syncGameObject(topBarResPath, self.rootTrans)
  self.topBar.name = "commonTopBar"
  self.topBarTrans = self.topBar.transform
  self.topBarModule = require(topBarMoudlePath).new(G_UIModuleBase.ModuleType.Dynamic)
  self.topBarModule:created()
  self.topBarModule:toBind(self.topBar:GetComponent(typeof(C_UIBinding)))
  L_UI:addListener(L_UI.pageEvent.preOpen, self.onPagePreOpen, self)
  L_UI:addListener(L_UI.pageEvent.closed, self.onPageClosed, self)
end

function this:dispose()
  L_UI:removeListener(L_UI.pageEvent.preOpen, self.onPagePreOpen, self)
  L_UI:removeListener(L_UI.pageEvent.closed, self.onPageClosed, self)
  self:disposeTimer()
  if self.topBarModule then
    self.topBarModule:unBind()
    self.topBarModule:disposeUIBinding()
    self.topBarModule = nil
  end
  if self.rootTrans ~= nil and L_CommonUtil.isValid(self.rootTrans.gameObject) then
    C_GameObject.Destroy(self.rootTrans.gameObject)
  end
  self.topBar = nil
  self.topBarModule = nil
  self.closeTime = nil
end

function this:getTopBarConfigData(pageName)
  local tpl = uiTopBarTpl:getTplByPageName(pageName)
  if not tpl then
    return nil
  end
  local data = {
    backName = uiTopBarTpl:getBackTxt(tpl),
    helpBtnShow = uiTopBarTpl:getHelpButton(tpl),
    mainBtnShow = uiTopBarTpl:getNavigationButton(tpl),
    pageName = pageName,
    introId = uiTopBarTpl:getIntroductionGroupId(tpl),
    resource = uiTopBarTpl:getResourceBar(tpl)
  }
  return data
end

function this:getCloseAniamtionTime()
  return self.closeTime or 0
end

function this:setTopBar(data)
  if self.topBarModule ~= nil then
    self.topBarModule:initModule(data)
  end
end

function this:setResourcesBySystemId(systemId)
  local tpl_sys
  if systemId ~= nil then
    tpl_sys = L_GameTpl:getSystemUnlockTpl():getTplById(systemId)
  end
  if self.topBarModule ~= nil then
    self.topBarModule:refreshTopBarResources(tpl_sys)
  end
end

function this:setResourcesByResList(resList)
  if self.topBarModule ~= nil then
    self.topBarModule:setResources(resList)
  end
end

function this:setTopBarBackName(txtName)
  if self.topBarModule ~= nil then
    self.topBarModule:setBackName(txtName)
  end
end

function this:setTopBarReturnBtnVisible(isShow)
  if self.topBarModule ~= nil then
    self.topBarModule:setReturnBtnVisible(isShow)
  end
end

function this:setTopBarHelpBtnVisible(isShow)
  if self.topBarModule ~= nil then
    self.topBarModule:setHelpBtnVisible(isShow)
  end
end

function this:setTopBarMainBtnVisible(isShow)
  if self.topBarModule ~= nil then
    self.topBarModule:setMainBtnVisible(isShow)
  end
end

function this:setTopBarCloseFunc(closeFunc)
  if self.topBarModule ~= nil then
    self.topBarModule:setCloseFunc(closeFunc)
  end
end

function this:setTopBarHelpBtnFunc(helpBtnFunc)
  if self.topBarModule ~= nil then
    self.topBarModule:setHelpBtnFunc(helpBtnFunc)
  end
end

function this:setTopBarMainBtnFunc(mainBtnFunc)
  if self.topBarModule ~= nil then
    self.topBarModule:setMainBtnFunc(mainBtnFunc)
  end
end

function this:setTopBarVisible(isShow)
  if self.topBarModule ~= nil then
    self.topBarModule:setVisible(isShow)
  end
end

return this
