using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Cute;
using UnityEngine;
using Wizard.Battle.UI;
using Wizard.Battle.View;
using Wizard.Battle.View.Vfx;

namespace Wizard.Battle.Mulligan;

public abstract class MulliganMgrBase : IMulliganMgr
{
	protected OpponentMulliganCtrl _opponentMulliganControl;

	private const float MULLIGAN_LIMIT_TIME = 5f;

	private Coroutine mulliganTimeoutCoroutine;

	public PlayerMulliganCtrl PlayerMlgCtrl { get; protected set; }

	public OpponentMulliganCtrl OpponentMlgCtrl => _opponentMulliganControl;

	public IList<BattleCardBase> AbandonList => PlayerMlgCtrl.AbandonList;

	public Action OnSubmit { get; set; }

	public VfxBase StartDeal(List<int> playerDealIdxList, List<int> oppoDealIdxList, SkillProcessor skillProcessor)
	{
		ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create();
		parallelVfxPlayer.Register(InstantVfx.Create(StopTimeout));
		PlayerMlgCtrl.DealIdxList = playerDealIdxList;
		_opponentMulliganControl.DealIdxList = oppoDealIdxList;
		PlayerMlgCtrl.CreateMulliganDealList(playerDealIdxList);
		_opponentMulliganControl.CreateMulliganDealList(oppoDealIdxList);
		VfxBase instance = NullVfx.GetInstance();
		VfxBase instance2 = NullVfx.GetInstance();
		instance = PlayerMlgCtrl.StartMulliganVfx(skillProcessor);
		instance2 = _opponentMulliganControl.StartMulliganVfx(skillProcessor);
		parallelVfxPlayer.Register(instance);
		parallelVfxPlayer.Register(instance2);
		if (BattleManagerBase.GetIns().IsRecovery && Data.BattleRecoveryInfo.IsMulliganEnd)
		{
			return NullVfx.GetInstance();
		}
		return parallelVfxPlayer;
	}

	protected virtual void StartTimeout()
	{
		StopTimeout();
		mulliganTimeoutCoroutine = BattleCoroutine.GetInstance().StartCoroutine(MulliganNetworkTimeout());
	}

	protected virtual void StopTimeout()
	{
		if (mulliganTimeoutCoroutine != null)
		{
			BattleCoroutine.GetInstance().StopCoroutine(mulliganTimeoutCoroutine);
			mulliganTimeoutCoroutine = null;
		}
		BattleManagerBase.GetIns().BattlePlayer.BattleView.HideAlertDialogue();
	}

	private IEnumerator MulliganNetworkTimeout()
	{
		long matchedTimer = TimeUtil.GetAbsoluteTime().Ticks;
		do
		{
			yield return null;
			if (BattleManagerBase.GetIns().IsBattleEnd)
			{
				StopTimeout();
				yield break;
			}
		}
		while (!((float)NetworkUtility.GetTimeSpanSecond(matchedTimer) >= 5f));
		BattleManagerBase.GetIns().BattlePlayer.BattleView.ShowAlert(PanelMgr.BattleAlertType.DisconnectInfomationMulligan, isClass: false);
	}

	public virtual VfxBase Submit(BattleManagerBase m_BtlMgrIns)
	{
		OnSubmit.Call();
		ImmediateVfxMgr.GetInstance().Register(PlayerMlgCtrl.MoveMulliganUIOutWhenSubmitMulligan());
		return NullVfx.GetInstance();
	}

	private void AddBattleLogMulliganResult(BattleManagerBase battleMgr)
	{
		BattleLogManager instance = BattleLogManager.GetInstance();
		instance.AddLogMulliganChanged(battleMgr.BattlePlayer, PlayerMlgCtrl.GetChangedNum());
		instance.AddLogMulliganChanged(battleMgr.BattleEnemy, OpponentMlgCtrl.GetChangedNum());
	}

	public virtual VfxBase PlayerChangeCardVfx(BattleManagerBase btlMgrIns)
	{
		VfxBase result = PlayerMlgCtrl.SubmitMulliganVfx(PlayerMlgCtrl.AbandonList);
		List<int> completeCards = btlMgrIns.BattlePlayer.HandCardList.Select((BattleCardBase c) => c.Index).ToList();
		btlMgrIns.BattlePlayer.CallRecordingMulligan(PlayerMlgCtrl.AbandonList, completeCards);
		btlMgrIns.BattlePlayer.CallRecordingMulliganEnd(btlMgrIns.BattlePlayer.HandCardList);
		return result;
	}

	public abstract VfxBase EnemyChangeCardVfx(BattleManagerBase btlMgrIns);

	public virtual VfxBase CompleteMulligan(BattleManagerBase battleMgr)
	{
		if (!battleMgr.IsVirtualBattle && !GameMgr.GetIns().IsNewReplayBattle)
		{
			AddBattleLogMulliganResult(battleMgr);
		}
		return NullVfx.GetInstance();
	}

	public virtual VfxBase InitMulligan(MulliganInfoControl mulliganInfo, IPlayerView view)
	{
		PlayerMlgCtrl = new PlayerMulliganCtrl(BattleManagerBase.GetIns().BattlePlayer, mulliganInfo, view);
		_opponentMulliganControl = new OpponentMulliganCtrl(BattleManagerBase.GetIns().BattleEnemy, mulliganInfo, isUseExchangeMark: false);
		return NullVfx.GetInstance();
	}

	public virtual VfxBase MulliganStartDraw(bool firstAttack, SkillProcessor skillProcessor)
	{
		ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create();
		VfxBase instance = NullVfx.GetInstance();
		VfxBase instance2 = NullVfx.GetInstance();
		if (firstAttack)
		{
			instance = PlayerMlgCtrl.StartMulliganVfx(skillProcessor);
			instance2 = _opponentMulliganControl.StartMulliganVfx(skillProcessor);
		}
		else
		{
			instance2 = _opponentMulliganControl.StartMulliganVfx(skillProcessor);
			instance = PlayerMlgCtrl.StartMulliganVfx(skillProcessor);
		}
		parallelVfxPlayer.Register(instance);
		parallelVfxPlayer.Register(instance2);
		return parallelVfxPlayer;
	}

	public virtual VfxBase RecoverMulligan(bool didPlayerSubmitMulligan, BattleManagerBase battleMgr)
	{
		return NullVfx.GetInstance();
	}

	public MulliganInfoControl GetMulliganInfo()
	{
		return PlayerMlgCtrl.GetMulliganInfo();
	}
}
