using System;
using System.Linq;
using UnityEngine;
///
/// 竞技场奖励窗口:functionOrder=0/1/2 → 本服日/本服周/跨服周奖励
///
public class ArenaCrossAwardWin : FunctionsBaseWin
{
[HideInInspector] public string valueFormat = "{0}";
[SerializeField] ArenaPlayerRankCell myRankCell;
[SerializeField] ButtonEx btnClose;
[SerializeField] TextEx txtCountdown;
[SerializeField] Transform localDayRect;
[SerializeField] ScrollerController scrLocalDayAward;
[SerializeField] Transform localWeekRect;
[SerializeField] ScrollerController scrLocalWeekAward;
[SerializeField] Transform crossWeekRect;
[SerializeField] ScrollerController scrCrossWeekAward;
protected override void InitComponent()
{
base.InitComponent();
btnClose.SetListener(CloseWindow);
}
protected override void OnPreOpen()
{
base.OnPreOpen();
ArenaManager.Instance.OnArenaMatchListEvent += OnArenaMatchListEvent;
ArenaManager.Instance.OnUpdateArenaPlayerInfo += OnUpdateArenaPlayerInfo;
ArenaManager.Instance.OnUpdateGameRecInfo += OnUpdateGameRecInfo;
RankModel.Instance.onRankRefresh += OnRankRefresh;
GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
scrLocalDayAward.OnRefreshCell += OnRefreshLocalDayCell;
scrLocalWeekAward.OnRefreshCell += OnRefreshLocalWeekCell;
scrCrossWeekAward.OnRefreshCell += OnRefreshCrossWeekCell;
Display();
}
protected override void OnPreClose()
{
base.OnPreClose();
ArenaManager.Instance.OnArenaMatchListEvent -= OnArenaMatchListEvent;
ArenaManager.Instance.OnUpdateArenaPlayerInfo -= OnUpdateArenaPlayerInfo;
ArenaManager.Instance.OnUpdateGameRecInfo -= OnUpdateGameRecInfo;
RankModel.Instance.onRankRefresh -= OnRankRefresh;
GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
scrLocalDayAward.OnRefreshCell -= OnRefreshLocalDayCell;
scrLocalWeekAward.OnRefreshCell -= OnRefreshLocalWeekCell;
scrCrossWeekAward.OnRefreshCell -= OnRefreshCrossWeekCell;
}
private void OnSecondEvent()
{
TimeSpan remainingTime;
if (functionOrder == 0)
{
// 本服日奖励:使用到明天0点的时间
remainingTime = TimeUtility.ServerNow.AddDays(1).Date - TimeUtility.ServerNow;
}
else if (functionOrder == 1)
{
// 本服周奖励:使用本服赛季结束时间
ArenaManager.Instance.GetCurrentSeasonDates(out _, out DateTime seasonEndDate);
remainingTime = seasonEndDate - TimeUtility.ServerNow;
}
else
{
// 跨服周奖励:使用跨服赛季结束时间
var crossZoneInfo = CrossServerBaseManager.Instance.GetCrossZoneInfo(ArenaManager.Instance.DataMapID);
int zoneID = crossZoneInfo != null ? (int)crossZoneInfo.ZoneID : 0;
ArenaManager.Instance.GetCrossCurrentSeasonDates(zoneID, out _, out DateTime crossSeasonEndDate);
remainingTime = crossSeasonEndDate - TimeUtility.ServerNow;
}
int remainingSeconds = (int)remainingTime.TotalSeconds;
bool hasTime = remainingSeconds > 0;
txtCountdown.SetActive(hasTime);
if (hasTime)
txtCountdown.text = Language.Get("Arena14", TimeUtility.SecondsToDHMSCHS(remainingSeconds));
}
protected override void OpenSubUIByTabIndex()
{
Display();
}
private void OnRefreshLocalDayCell(ScrollerDataType type, CellView cell)
{
cell.GetComponent()?.Display(cell.index, cell);
}
private void OnRefreshLocalWeekCell(ScrollerDataType type, CellView cell)
{
cell.GetComponent()?.Display(cell.index, cell);
}
private void OnRefreshCrossWeekCell(ScrollerDataType type, CellView cell)
{
cell.GetComponent()?.Display(cell.index, cell);
}
private void OnArenaMatchListEvent() => Display();
private void OnUpdateArenaPlayerInfo() => Display();
private void OnUpdateGameRecInfo() => Display();
private void OnRankRefresh(int _) => DisplayMyRank();
private void Display()
{
localDayRect.SetActive(functionOrder == 0);
localWeekRect.SetActive(functionOrder == 1);
crossWeekRect.SetActive(functionOrder == 2);
CreateScroller();
DisplayMyRank();
OnSecondEvent();
}
private void CreateScroller()
{
switch (functionOrder)
{
case 0:
CreateLocalDayScroller();
break;
case 1:
CreateLocalWeekScroller();
break;
case 2:
CreateCrossWeekScroller();
break;
}
DisplayMyRank();
OnSecondEvent();
}
private void CreateLocalDayScroller()
{
scrLocalDayAward.Refresh();
var rewardDict = ArenaManager.Instance.GetCrossArenaAwardDict(0);
if (rewardDict.IsNullOrEmpty()) return;
var sortedKeys = rewardDict.Keys.ToList();
sortedKeys.Sort();
CellInfo cellInfo = new CellInfo { infoInt1 = 0 };
for (int i = 0; i < sortedKeys.Count; i++)
scrLocalDayAward.AddCell(ScrollerDataType.Header, i, cellInfo);
scrLocalDayAward.Restart();
}
private void CreateLocalWeekScroller()
{
scrLocalWeekAward.Refresh();
var rewardDict = ArenaManager.Instance.GetCrossArenaAwardDict(1);
if (rewardDict.IsNullOrEmpty()) return;
var sortedKeys = rewardDict.Keys.ToList();
sortedKeys.Sort();
CellInfo cellInfo = new CellInfo { infoInt1 = 1 };
for (int i = 0; i < sortedKeys.Count; i++)
scrLocalWeekAward.AddCell(ScrollerDataType.Header, i, cellInfo);
scrLocalWeekAward.Restart();
}
private void CreateCrossWeekScroller()
{
scrCrossWeekAward.Refresh();
var rewardDict = ArenaManager.Instance.GetCrossArenaAwardDict(2);
if (rewardDict.IsNullOrEmpty()) return;
var sortedKeys = rewardDict.Keys.ToList();
sortedKeys.Sort();
CellInfo cellInfo = new CellInfo { infoInt1 = 2 };
for (int i = 0; i < sortedKeys.Count; i++)
scrCrossWeekAward.AddCell(ScrollerDataType.Header, i, cellInfo);
scrCrossWeekAward.Restart();
}
private void DisplayMyRank()
{
myRankCell.Display(ArenaManager.Instance.rankType, 0, valueFormat);
}
}