--兵法蓝图选关主界面
local XUiRpgTowerNewMain = XLuaUiManager.Register(XLuaUi, "UiRpgTowerNewMain")
local XUiRpgMainTagGrid = require("XUi/XUiRpgTower/MainPage/PanelTag/XUiRpgMainTagGrid")

function XUiRpgTowerNewMain:OnAwake()
    self.MaxLevel = XDataCenter.RpgTowerManager.GetMaxLevel()
    self.BtnDic = {}
    self.RedEvents = {}
    self:InitButtons()
    self:InitTagGroup()
    self.AssetPanel = XUiPanelAsset.New(self, self.PanelAsset, XDataCenter.ItemManager.ItemId.FreeGem, XDataCenter.ItemManager.ItemId.ActionPoint, XDataCenter.ItemManager.ItemId.Coin)

    XEventManager.AddEventListener(XEventId.EVENT_RPGTOWER_TEAM_LV_REFRESH, self.RefreshTeamLevel, self)
end


function XUiRpgTowerNewMain:InitButtons()
    XUiHelper.RegisterClickEvent(self, self.BtnBack, self.Close)
    XUiHelper.RegisterClickEvent(self, self.BtnMainUi, function() XLuaUiManager.RunMain() end)
    XUiHelper.RegisterClickEvent(self, self.BtnTask, function() XLuaUiManager.Open("UiRpgTowerTask") end)
    XUiHelper.RegisterClickEvent(self, self.BtnGift, self.OnBtnGiftClick)
    XUiHelper.RegisterClickEvent(self, self.BtnTeam, self.OnTeamClick)

    self:BindHelpBtn(self.BtnHelp, "RpgTowerHelp")
end

function XUiRpgTowerNewMain:InitTagGroup()
    -- 入口标签组初始化
    for i = 1, self.PanelGroup.childCount do
        local tagGrid = self.BtnDic[i]
        if not tagGrid then
            local tagGo = self.PanelGroup:Find("Btn"..i)
            tagGrid = XUiRpgMainTagGrid.New(tagGo)
            self.BtnDic[i] = tagGrid
        end
    end
end

function XUiRpgTowerNewMain:OnEnable()
    self:RefreshGrids()
    self:RefreshReward()
    self:InitTeamLevel()
    self:AddRedPointEvents()

    self:SetTimer()
end

function XUiRpgTowerNewMain:RefreshGrids()
    -- 刷新
    self.AllConfigs = XRpgTowerConfig.GetRTagConfigs()
    for i, tagGrid in pairs(self.BtnDic) do
        tagGrid:Refresh(self.AllConfigs[i])
    end
end

--加载队伍经验条
function XUiRpgTowerNewMain:InitTeamLevel(showEffect)
    self.CurrLv = XDataCenter.RpgTowerManager.GetCurrentLevel()
    self.Exp = XDataCenter.RpgTowerManager.GetCurrentExp()
    local isMaxLv = self.MaxLevel == self.CurrLv
    if isMaxLv then
        self.Exp = CS.XTextManager.GetText("RpgTowerMaxLevel")
    end
    
    local cfg = XRpgTowerConfig.GetTeamLevelCfgByLevel(self.CurrLv)
    self.NextExp = cfg and cfg.Exp or self.Exp -- 满级 self.Exp / self.NextExp就等于 1
    self.TxtTeamLv.text = self.CurrLv
    -- local bgLv = (self.CurrLv < 10) and "0"..self.CurrLv or self.CurrLv -- 大的数字要两位数,不足补0
    -- self.TxtLvBig.text = bgLv
    self.EffectLevel.gameObject:SetActiveEx(showEffect) -- 升级特效
    self.TxtExp.text = isMaxLv and CS.XTextManager.GetText("RpgTowerMaxLevel") or CS.XTextManager.GetText("CommonSlashStr", self.Exp, self.NextExp)
    self.ImgExp.fillAmount = isMaxLv and 1 or self.Exp / self.NextExp
end

-- 刷新队伍经验(在当前面板升级)播放升级进度条动画
function XUiRpgTowerNewMain:RefreshTeamLevel(newLv, newExp)
    if newLv < self.CurrLv or newLv == self.MaxLevel then
        return
    end
    self.EffectLevel.gameObject:SetActiveEx(false)

    local round = newLv - self.CurrLv --进度条转的圈数
    local currExp = self.Exp
    local addTotalExp = XRpgTowerConfig.GetTeamLevelCfgByLevel(self.CurrLv).Exp - currExp
    if round > 0 then
        if round > 1 then
            for i = self.CurrLv + 1, newLv - 1, 1 do
                addTotalExp = addTotalExp + XRpgTowerConfig.GetTeamLevelCfgByLevel(i).Exp
            end
        end
        addTotalExp = addTotalExp + newExp
    end
    local addSpeed = addTotalExp / 60
    
    if self.AnimTimer then
        XScheduleManager.UnSchedule(self.AnimTimer)   
        self.AnimTimer = nil
    end
    self.AnimTimer = XUiHelper.Tween(1, function ()
        -- 先转圈
        local cfg = XRpgTowerConfig.GetTeamLevelCfgByLevel(newLv - round)
        local nextExp = cfg and cfg.Exp or self.Exp --.Exp字段是升到下级需要达到的exp
        if round > 0 then
            currExp = currExp + addSpeed
            self.ImgExp.fillAmount = currExp / nextExp --不用在意这个速度

            if currExp / nextExp >= 1 then -- 转完一圈 减round
                round = round - 1
                currExp = 0
            end
        elseif round == 0 then
            -- 转完了,没有圈数了 停留在经验值的当前值
            currExp = currExp + addSpeed
            self.ImgExp.fillAmount = currExp / nextExp

            if currExp >= newExp then -- 
                round = -1 --将圈数置负,不再进入判断
                self.ImgExp.fillAmount = newExp / nextExp
            end
        end

    end, function ()
        local showEffect = newLv - self.CurrLv > 0
        self:InitTeamLevel(showEffect)
    end)
end

-- 刷新奖励
function XUiRpgTowerNewMain:RefreshReward()
    local count = 0
    local dayPass = XDataCenter.RpgTowerManager.GetDayCount()
    local allDailyRewards = XDataCenter.RpgTowerManager.GetDailyRewards()
    local rewardId = allDailyRewards[dayPass]
    if rewardId then
        local reward = XRewardManager.GetRewardList(rewardId)
        count = reward[1].Count -- 策划说奖励只会配1个
    end
    local isShow = (count > 0) and XDataCenter.RpgTowerManager.GetCanReceiveSupply()
    -- self.BtnGift:SetNameByGroup(0, count)
    self.BtnGift.transform:Find("ImgReceived").gameObject:SetActiveEx(not isShow)
    self.BtnGift:ShowReddot(isShow)
end

-- 领取奖励
function XUiRpgTowerNewMain:OnBtnGiftClick()
    if XDataCenter.RpgTowerManager.GetCanReceiveSupply() then
        XDataCenter.RpgTowerManager.ReceiveSupply()
    else
        XUiManager.TipMsg(CS.XTextManager.GetText("RpgTowerCantGetSupply"))
    end
end

function XUiRpgTowerNewMain:SetTimer()
    self:StopTimer()
    self:SetResetTime()
    self.Timer = XScheduleManager.ScheduleForever(function()
            self:SetResetTime()
        end, XScheduleManager.SECOND, 0)
end

--显示倒计时与处理倒计时完成时事件
function XUiRpgTowerNewMain:SetResetTime()
    local endTimeSecond = XDataCenter.RpgTowerManager.GetEndTime()
    local now = XTime.GetServerNowTimestamp()
    local leftTime = endTimeSecond - now
    local remainTime = XUiHelper.GetTime(leftTime, XUiHelper.TimeFormatType.STRONGHOLD)
    self.TxtRemainTime.text = CS.XTextManager.GetText("ShopActivityItemCount", remainTime)
    if leftTime <= 0 then
        self:OnActivityReset()
    end
end

--停止界面计时器
function XUiRpgTowerNewMain:StopTimer()
    if self.Timer then
        XScheduleManager.UnSchedule(self.Timer)
        self.Timer = nil
    end
end

--活动周期结束时弹回主界面
function XUiRpgTowerNewMain:OnActivityReset()
    if self.IsReseting then return end
    self.IsReseting = true
    self:StopTimer()
    XLuaUiManager.RunMain()
    XUiManager.TipMsg(CS.XTextManager.GetText("RpgTowerFinished"))
end

function XUiRpgTowerNewMain:OnTeamClick()
    XLuaUiManager.Open("UiRpgTowerRoleList")
end

function XUiRpgTowerNewMain:OnGetEvents()
    return { XEventId.EVENT_RPGTOWER_RESET, XEventId.EVENT_RPGTOWER_REFRESH_DAILYREWARD }
end

function XUiRpgTowerNewMain:OnNotify(evt, ...)
    local args = { ... }
    if evt == XEventId.EVENT_RPGTOWER_RESET then
        self:OnActivityReset()
    elseif evt == XEventId.EVENT_RPGTOWER_REFRESH_DAILYREWARD then
        self:RefreshReward()
    end
end

function XUiRpgTowerNewMain:OnDisable()
    self:StopTimer()
    self:RemoveRedPointEvents()

    if self.AnimTimer then
        XScheduleManager.UnSchedule(self.AnimTimer)   
        self.AnimTimer = nil
    end
end

function XUiRpgTowerNewMain:OnDestroy()
    XEventManager.RemoveEventListener(XEventId.EVENT_RPGTOWER_TEAM_LV_REFRESH, self.RefreshTeamLevel, self)
end

function XUiRpgTowerNewMain:AddRedPointEvents()
    if self.AlreadyAddRed then return end
    self.AlreadyAddRed = true
    table.insert(self.RedEvents, XRedPointManager.AddRedPointEvent(self.BtnTask, self.OnCheckBtnTaskRedPoint, self, { XRedPointConditions.Types.CONDITION_RPGTOWER_TASK_RED }))
    table.insert(self.RedEvents, XRedPointManager.AddRedPointEvent(self.BtnTeam, self.OnCheckBtnTeamRedPoint, self, { XRedPointConditions.Types.CONDITION_RPGTOWER_TEAM_RED }))
end

function XUiRpgTowerNewMain:RemoveRedPointEvents()
    if not self.AlreadyAddRed then return end
    for _, eventId in pairs(self.RedEvents) do
        XRedPointManager.RemoveRedPointEvent(eventId)
    end
    self.RedEvents = {}
    self.AlreadyAddRed = false
end

function XUiRpgTowerNewMain:OnCheckBtnTaskRedPoint(count)
    self.BtnTask:ShowReddot(count >= 0)
end

function XUiRpgTowerNewMain:OnCheckBtnTeamRedPoint(count)
    self.BtnTeam:ShowReddot(count >= 0)
end

return XUiRpgTowerNewMain