using System;
using System.Collections.Generic;
using LitJson;
using UnityEngine;

namespace Wizard;

public class MyRotationAllInfo
{
	public class PeriodData
	{
		public DateTime BeginTime = DateTime.MaxValue;

		public DateTime EndTime = DateTime.MinValue;

		public double StartUnixTime { get; set; }

		public double EndUnixTime { get; set; }
	}

	private Dictionary<string, MyRotationInfo> _myRotationDictionary = new Dictionary<string, MyRotationInfo>();

	public PeriodData GatheringPeriod = new PeriodData();

	public PeriodData FreeMatchPeriod = new PeriodData();

	private bool _myRotationScheduleExist;

	private float _receiveSinceTime;

	private double _receiveServerUnixTime;

	public List<MyRotationInfo> MyRotationInfoList { get; } = new List<MyRotationInfo>();

	public MyRotationInfo FirstPackInfo { get; private set; }

	public MyRotationInfo FirstPackInfoNemesis { get; private set; }

	public List<MyRotationAbilityGroup> AbilityGroup { get; private set; } = new List<MyRotationAbilityGroup>();

	public List<string> DisableCardPackIdList { get; private set; } = new List<string>();

	public bool IsFinishInitializeText { get; private set; }

	public bool IsMyRotationEnable => IsWithinPeriod(FreeMatchPeriod);

	public bool IsWithinGatheringPeriod => IsWithinPeriod(GatheringPeriod);

	public bool IsWithinFreeMatchPeriod => IsWithinPeriod(FreeMatchPeriod);

	public bool IsWithinCopyDeckIntroductionPeriod => IsWithinFreeMatchPeriod;

	public void InitializeText()
	{
		IsFinishInitializeText = true;
		int num = int.MaxValue;
		int num2 = int.MaxValue;
		foreach (MyRotationInfo myRotationInfo in MyRotationInfoList)
		{
			myRotationInfo.InitializeText();
			int num3 = int.Parse(myRotationInfo.LastPackId);
			if (num3 < num)
			{
				num = num3;
				FirstPackInfo = myRotationInfo;
			}
			if (myRotationInfo.IsEnableNemesis && num3 < num2)
			{
				num2 = num3;
				FirstPackInfoNemesis = myRotationInfo;
			}
		}
		InitializeAbilityGroup();
		InitializeRePrintCard();
	}

	private void InitializeRePrintCard()
	{
		CardMaster instance = CardMaster.GetInstance(FormatBehaviorManager.GetDefaultBehaviour(Format.MyRotation).CardMasterId);
		List<int> allCardIds = instance.GetAllCardIds();
		List<CardParameter> list = new List<CardParameter>(allCardIds.Count);
		foreach (int item in allCardIds)
		{
			list.Add(instance.GetCardParameterFromId(item));
		}
		foreach (MyRotationInfo myRotationInfo in MyRotationInfoList)
		{
			myRotationInfo.InitializeRePrintCard(list);
		}
	}

	public MyRotationInfo Get(string id)
	{
		if (string.IsNullOrEmpty(id))
		{
			return null;
		}
		if (_myRotationDictionary.TryGetValue(id, out var value))
		{
			return value;
		}
		return null;
	}

	private void InitializeAbilityGroup()
	{
		if (MyRotationInfoList.Count == 0)
		{
			return;
		}
		MyRotationInfo myRotationInfo = MyRotationInfoList[0];
		MyRotationInfo lastPack = MyRotationInfoList[0];
		bool isFirst = true;
		for (int i = 0; i < MyRotationInfoList.Count; i++)
		{
			MyRotationInfo myRotationInfo2 = MyRotationInfoList[i];
			if (!MyRotationInfo.IsEqualAbility(myRotationInfo, myRotationInfo2))
			{
				AbilityGroup.Add(CreateGroup(myRotationInfo, lastPack, isFirst));
				isFirst = false;
				myRotationInfo = (lastPack = myRotationInfo2);
			}
			else
			{
				lastPack = myRotationInfo2;
			}
		}
		AbilityGroup.Add(CreateGroup(myRotationInfo, lastPack, isFirst));
	}

	private static MyRotationAbilityGroup CreateGroup(MyRotationInfo startPack, MyRotationInfo lastPack, bool isFirst)
	{
		int startNumber = int.Parse(startPack.LastPackId) - 10000;
		int lastNumber = int.Parse(lastPack.LastPackId) - 10000;
		string shortName = Data.Master.CardSetNameMgr.Get(startPack.LastPackId).ShortName;
		string shortName2 = Data.Master.CardSetNameMgr.Get(lastPack.LastPackId).ShortName;
		if (isFirst)
		{
			startNumber = int.Parse(startPack.FirstPackId) - 10000;
			shortName = Data.Master.CardSetNameMgr.Get(startPack.FirstPackId).ShortName;
		}
		return new MyRotationAbilityGroup(startNumber, lastNumber, shortName, shortName2, startPack.Abilities);
	}

	public void Parse(JsonData json, JsonData headerData)
	{
		JsonData jsonData = json["setting"];
		JsonData jsonData2 = json["restricted_base_card_id_list"];
		JsonData jsonData3 = json["abilities"];
		foreach (string key in jsonData.Keys)
		{
			MyRotationInfo myRotationInfo = new MyRotationInfo(jsonData[key]);
			_myRotationDictionary[myRotationInfo.Id] = myRotationInfo;
			MyRotationInfoList.Add(myRotationInfo);
		}
		if (jsonData2.IsObject)
		{
			foreach (string key2 in jsonData2.Keys)
			{
				_myRotationDictionary[key2].ParseRestrictJson(jsonData2[key2]);
			}
		}
		JsonData jsonData4 = json["reprinted_base_card_ids"];
		if (jsonData4.IsObject)
		{
			foreach (string key3 in jsonData4.Keys)
			{
				_myRotationDictionary[key3].ParseRePrintJson(jsonData4[key3]);
			}
		}
		if (jsonData3.IsObject)
		{
			foreach (MyRotationInfo myRotationInfo2 in MyRotationInfoList)
			{
				myRotationInfo2.ParseAbilitiesJson(jsonData3);
			}
		}
		JsonData jsonData5 = json["schedules"];
		if (jsonData5.IsObject)
		{
			if (jsonData5.TryGetValue("gathering", out var value))
			{
				SetPeriodData(GatheringPeriod, value);
			}
			if (jsonData5.TryGetValue("free_battle", out var value2))
			{
				SetPeriodData(FreeMatchPeriod, value2);
				_myRotationScheduleExist = true;
				_receiveSinceTime = Time.realtimeSinceStartup;
				_receiveServerUnixTime = headerData["servertime"].ToDouble();
			}
		}
		if (json.TryGetValue("disable_card_set_ids", out var value3))
		{
			for (int i = 0; i < value3.Count; i++)
			{
				DisableCardPackIdList.Add(value3[i].ToString());
			}
		}
	}

	private void SetPeriodData(PeriodData period, JsonData jsonData)
	{
		period.BeginTime = DateTime.Parse(jsonData["begin_time"].ToString());
		period.EndTime = DateTime.Parse(jsonData["end_time"].ToString());
		period.StartUnixTime = ConvertTime.DateTimeToUnixTime(DateTime.Parse(jsonData["begin_time"].ToString()));
		period.EndUnixTime = ConvertTime.DateTimeToUnixTime(DateTime.Parse(jsonData["end_time"].ToString()));
	}

	private bool IsWithinPeriod(PeriodData period)
	{
		if (!_myRotationScheduleExist)
		{
			return false;
		}
		double num = _receiveServerUnixTime + (double)Time.realtimeSinceStartup - (double)_receiveSinceTime;
		if (num >= period.EndUnixTime)
		{
			return false;
		}
		return num > period.StartUnixTime;
	}
}
