using UnityEngine;

public class MyPageCardPanelAnimation : MonoBehaviour
{
	public enum State
	{
		Start,
		Move,
		Color,
		End
	}

	private const float RANDOM_TIMER_RANGE = 0.3f;

	private const float ORIGINAL_POS_X = -22100f;

	private const float COLOR_TIME = 0.6f;

	private const float START_WAIT_TIMER = 0.05f;

	private static readonly float[] ANGLES_3 = new float[3] { 5f, 0f, -5f };

	private static readonly float[] ANGLES_2 = new float[2] { 5f, -5f };

	private static readonly float[] ANGLES_1 = new float[1];

	private const float CARD_ORIGINAL_POS_X = -1000f;

	private const float CARD_DELAY_FACTOR = 0.03f;

	private const float CARD_TIME_MOTION = 0.0001f;

	private const float CARD_TIME_BASE = 0.2f;

	private const float CARD_TIME_FACTOR = 0.03f;

	private const float RANDOM_FACTOR = 5f;

	private const float ALPHA_FACTOR = 4f;

	private float ClickRotateTimeTotal;

	private float ClickRotateTime;

	private float ClickIndex;

	private bool _isCutCardMotion;

	private State _state = State.End;

	private float _timer;

	private float[] _randomTimer;

	private int[] _randomDir;

	private GameObject[] _cardPanel;

	private UIPanel[] _panel;

	private Vector3[] _defaultPosition;

	public bool IsCardMoving
	{
		get
		{
			if (!(ClickRotateTime > 0f))
			{
				return _state != State.End;
			}
			return true;
		}
	}

	public void SetCardPanelList(GameObject[] list)
	{
		_cardPanel = new GameObject[list.Length];
		for (int i = 0; i < list.Length; i++)
		{
			_cardPanel[i] = list[i];
			MyPageCardPanel component = list[i].GetComponent<MyPageCardPanel>();
			if (component != null)
			{
				component.Index = i;
			}
		}
		InitRandom();
		InitializePanel();
	}

	public void UpdateCardPanelDefaultPosition(Vector3[] newPosition)
	{
		_defaultPosition = newPosition;
	}

	public void PanelClear()
	{
		_panel = null;
	}

	private void InitializePanel()
	{
		if (_panel == null)
		{
			_panel = new UIPanel[_cardPanel.Length];
			_defaultPosition = new Vector3[_cardPanel.Length];
			for (int i = 0; i < _cardPanel.Length; i++)
			{
				GameObject gameObject = _cardPanel[i];
				_panel[i] = gameObject.GetComponent<UIPanel>();
				_defaultPosition[i] = gameObject.transform.localPosition;
			}
		}
	}

	public void StartCardPanelAnimation(bool isCutCardMotion)
	{
		_state = State.Start;
		_timer = 0f;
		_isCutCardMotion = isCutCardMotion;
		for (int i = 0; i < _cardPanel.Length; i++)
		{
			GameObject obj = _cardPanel[i];
			Vector3 localPosition = obj.transform.transform.localPosition;
			localPosition.x = -22100f;
			obj.transform.transform.localPosition = localPosition;
			iTween.Stop(obj);
		}
	}

	public void SkipMoveAnimation()
	{
		_state = State.End;
		ColorChange(isForceOpacity: true);
	}

	private void Update()
	{
		if (_panel != null)
		{
			UpdateCard();
		}
	}

	private void UpdateCard()
	{
		float[] array = (new float[4][] { null, ANGLES_1, ANGLES_2, ANGLES_3 })[_cardPanel.Length];
		if (_panel == null)
		{
			return;
		}
		switch (_state)
		{
		case State.Start:
		{
			ClickRotateTime = 0f;
			_timer += Time.deltaTime;
			for (int k = 0; k < _cardPanel.Length; k++)
			{
				GameObject obj = _cardPanel[k];
				Vector3 localPosition = obj.transform.transform.localPosition;
				localPosition.x = -1000f;
				localPosition.y = _defaultPosition[k].y;
				obj.transform.transform.localPosition = localPosition;
				obj.transform.transform.localEulerAngles = new Vector3(0f, 0f, array[k]);
			}
			for (int l = 0; l < _cardPanel.Length; l++)
			{
				_panel[l].alpha = 0f;
			}
			if (_timer >= 0.05f)
			{
				_state++;
			}
			break;
		}
		case State.Move:
		{
			for (int j = 0; j < _cardPanel.Length; j++)
			{
				float x = _defaultPosition[j].x;
				iTween.MoveTo(_cardPanel[j], iTween.Hash("x", x, "time", _isCutCardMotion ? 0.0001f : (0.2f + (float)j * 0.03f), "delay", (float)j * 0.03f, "islocal", true, "easetype", iTween.EaseType.easeOutExpo));
			}
			if (!_isCutCardMotion)
			{
				GameMgr.GetIns().GetSoundMgr().PlaySe(Se.TYPE.SYS_SWITCH_MENU_CARD);
			}
			_state++;
			break;
		}
		case State.Color:
			_timer += Time.deltaTime;
			ColorChange();
			if (_timer >= 0.6f)
			{
				ColorChange(isForceOpacity: true);
				_state++;
				_timer = 0f;
				InitRandom();
			}
			break;
		case State.End:
		{
			for (int i = 0; i < _cardPanel.Length; i++)
			{
				float num = 0f;
				if ((float)i == ClickIndex && ClickRotateTime > 0f)
				{
					ClickRotateTime -= Time.deltaTime;
					if (ClickRotateTime < 0f)
					{
						ClickRotateTime = 0f;
						_state = State.End;
					}
					float num2 = (ClickRotateTimeTotal - ClickRotateTime) / ClickRotateTimeTotal;
					num2 -= 1f;
					num2 = 0f - (num2 * num2 * num2 * num2 - 1f);
					num = 720f * num2;
				}
				_randomTimer[i] += Time.deltaTime;
				if (_randomTimer[i] >= 0f)
				{
					_cardPanel[i].transform.localEulerAngles = new Vector3(0f, num + (float)_randomDir[i] * 5f * Mathf.Sin(_randomTimer[i] / 2f), array[i] + (float)_randomDir[i] * Mathf.Sin(_randomTimer[i]));
				}
			}
			break;
		}
		}
	}

	public void SetCardPanelAngle()
	{
		float[] array = (new float[4][] { null, ANGLES_1, ANGLES_2, ANGLES_3 })[_cardPanel.Length];
		for (int i = 0; i < _cardPanel.Length; i++)
		{
			_cardPanel[i].transform.transform.localEulerAngles = new Vector3(0f, 0f, array[i]);
		}
	}

	private void ColorChange(bool isForceOpacity = false)
	{
		if (_panel == null)
		{
			return;
		}
		for (int i = 0; i < _cardPanel.Length; i++)
		{
			if (_panel[i].alpha < 1f && !isForceOpacity)
			{
				float alpha = _panel[i].alpha;
				alpha += Time.deltaTime * 4f;
				if (alpha >= 1f)
				{
					alpha = 1f;
				}
				_panel[i].alpha = alpha;
			}
			else
			{
				_panel[i].alpha = 1f;
			}
		}
	}

	public void OnClicked(int i, bool isPlaySe = true)
	{
		ClickRotateTimeTotal = 1f;
		ClickRotateTime = ClickRotateTimeTotal;
		ClickIndex = i;
		if (isPlaySe)
		{
			GameMgr.GetIns().GetSoundMgr().PlaySe(Se.TYPE.SYS_MENU_CARD);
		}
	}

	public void StopMove()
	{
		_state = State.End;
		for (int i = 0; i < _cardPanel.Length; i++)
		{
			iTween.Stop(_cardPanel[i]);
			if (_panel != null)
			{
				_panel[i].alpha = 1f;
			}
		}
		InitRandom();
		ColorChange(isForceOpacity: true);
	}

	private void InitRandom()
	{
		_randomDir = new int[_cardPanel.Length];
		_randomTimer = new float[_cardPanel.Length];
		for (int i = 0; i < _cardPanel.Length; i++)
		{
			_randomDir[i] = (((double)Random.value > 0.5) ? 1 : (-1));
			_randomTimer[i] = Random.Range(-0.3f, 0f);
		}
	}
}
