using System;
using UnityEngine;
using Valve.VR;

public class SteamVR_ControllerManager : MonoBehaviour
{
	private void Awake()
	{
		int num = (this.objects == null) ? 0 : this.objects.Length;
		GameObject[] array = new GameObject[2 + num];
		this.indices = new uint[2 + num];
		array[0] = this.right;
		this.indices[0] = uint.MaxValue;
		array[1] = this.left;
		this.indices[1] = uint.MaxValue;
		for (int i = 0; i < num; i++)
		{
			array[2 + i] = this.objects[i];
			this.indices[2 + i] = uint.MaxValue;
		}
		this.objects = array;
	}

	private void OnEnable()
	{
		for (int i = 0; i < this.objects.Length; i++)
		{
			GameObject gameObject = this.objects[i];
			if (gameObject != null)
			{
				gameObject.SetActive(false);
			}
		}
		this.OnTrackedDeviceRoleChanged(new object[0]);
		for (int j = 0; j < SteamVR.connected.Length; j++)
		{
			if (SteamVR.connected[j])
			{
				this.OnDeviceConnected(new object[]
				{
					j,
					true
				});
			}
		}
		SteamVR_Utils.Event.Listen("input_focus", new SteamVR_Utils.Event.Handler(this.OnInputFocus));
		SteamVR_Utils.Event.Listen("device_connected", new SteamVR_Utils.Event.Handler(this.OnDeviceConnected));
		SteamVR_Utils.Event.Listen("TrackedDeviceRoleChanged", new SteamVR_Utils.Event.Handler(this.OnTrackedDeviceRoleChanged));
	}

	private void OnDisable()
	{
		SteamVR_Utils.Event.Remove("input_focus", new SteamVR_Utils.Event.Handler(this.OnInputFocus));
		SteamVR_Utils.Event.Remove("device_connected", new SteamVR_Utils.Event.Handler(this.OnDeviceConnected));
		SteamVR_Utils.Event.Remove("TrackedDeviceRoleChanged", new SteamVR_Utils.Event.Handler(this.OnTrackedDeviceRoleChanged));
	}

	private void OnInputFocus(params object[] args)
	{
		bool flag = (bool)args[0];
		if (flag)
		{
			for (int i = 0; i < this.objects.Length; i++)
			{
				GameObject gameObject = this.objects[i];
				if (gameObject != null)
				{
					string str = (i >= 2) ? (i - 1).ToString() : SteamVR_ControllerManager.labels[i];
					this.ShowObject(gameObject.transform, "hidden (" + str + ")");
				}
			}
		}
		else
		{
			for (int j = 0; j < this.objects.Length; j++)
			{
				GameObject gameObject2 = this.objects[j];
				if (gameObject2 != null)
				{
					string str2 = (j >= 2) ? (j - 1).ToString() : SteamVR_ControllerManager.labels[j];
					this.HideObject(gameObject2.transform, "hidden (" + str2 + ")");
				}
			}
		}
	}

	private void HideObject(Transform t, string name)
	{
		Transform transform = new GameObject(name).transform;
		transform.parent = t.parent;
		t.parent = transform;
		transform.gameObject.SetActive(false);
	}

	private void ShowObject(Transform t, string name)
	{
		Transform parent = t.parent;
		if (parent.gameObject.name != name)
		{
			return;
		}
		t.parent = parent.parent;
		UnityEngine.Object.Destroy(parent.gameObject);
	}

	private void SetTrackedDeviceIndex(int objectIndex, uint trackedDeviceIndex)
	{
		if (trackedDeviceIndex != 4294967295u)
		{
			for (int i = 0; i < this.objects.Length; i++)
			{
				if (i != objectIndex && this.indices[i] == trackedDeviceIndex)
				{
					GameObject gameObject = this.objects[i];
					if (gameObject != null)
					{
						gameObject.SetActive(false);
					}
					this.indices[i] = uint.MaxValue;
				}
			}
		}
		if (trackedDeviceIndex != this.indices[objectIndex])
		{
			this.indices[objectIndex] = trackedDeviceIndex;
			GameObject gameObject2 = this.objects[objectIndex];
			if (gameObject2 != null)
			{
				if (trackedDeviceIndex == 4294967295u)
				{
					gameObject2.SetActive(false);
				}
				else
				{
					gameObject2.SetActive(true);
					gameObject2.BroadcastMessage("SetDeviceIndex", (int)trackedDeviceIndex, SendMessageOptions.DontRequireReceiver);
				}
			}
		}
	}

	private void OnTrackedDeviceRoleChanged(params object[] args)
	{
		this.Refresh();
	}

	private void OnDeviceConnected(params object[] args)
	{
		uint num = (uint)((int)args[0]);
		bool flag = this.connected[(int)((UIntPtr)num)];
		this.connected[(int)((UIntPtr)num)] = false;
		bool flag2 = (bool)args[1];
		if (flag2)
		{
			CVRSystem system = OpenVR.System;
			if (system != null && system.GetTrackedDeviceClass(num) == ETrackedDeviceClass.Controller)
			{
				this.connected[(int)((UIntPtr)num)] = true;
				flag = !flag;
			}
		}
		if (flag)
		{
			this.Refresh();
		}
	}

	public void Refresh()
	{
		int i = 0;
		CVRSystem system = OpenVR.System;
		if (system != null)
		{
			this.leftIndex = system.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.LeftHand);
			this.rightIndex = system.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.RightHand);
		}
		if (this.leftIndex == 4294967295u && this.rightIndex == 4294967295u)
		{
			uint num = 0u;
			while ((ulong)num < (ulong)((long)this.connected.Length))
			{
				if (this.connected[(int)((UIntPtr)num)])
				{
					this.SetTrackedDeviceIndex(i++, num);
					break;
				}
				num += 1u;
			}
		}
		else
		{
			this.SetTrackedDeviceIndex(i++, ((ulong)this.rightIndex >= (ulong)((long)this.connected.Length) || !this.connected[(int)((UIntPtr)this.rightIndex)]) ? uint.MaxValue : this.rightIndex);
			this.SetTrackedDeviceIndex(i++, ((ulong)this.leftIndex >= (ulong)((long)this.connected.Length) || !this.connected[(int)((UIntPtr)this.leftIndex)]) ? uint.MaxValue : this.leftIndex);
			if (this.leftIndex != 4294967295u && this.rightIndex != 4294967295u)
			{
				uint num2 = 0u;
				while ((ulong)num2 < (ulong)((long)this.connected.Length))
				{
					if (i >= this.objects.Length)
					{
						break;
					}
					if (this.connected[(int)((UIntPtr)num2)])
					{
						if (num2 != this.leftIndex && num2 != this.rightIndex)
						{
							this.SetTrackedDeviceIndex(i++, num2);
						}
					}
					num2 += 1u;
				}
			}
		}
		while (i < this.objects.Length)
		{
			this.SetTrackedDeviceIndex(i++, uint.MaxValue);
		}
	}

	public GameObject left;

	public GameObject right;

	public GameObject[] objects;

	private uint[] indices;

	private bool[] connected = new bool[16];

	private uint leftIndex = uint.MaxValue;

	private uint rightIndex = uint.MaxValue;

	private static string[] labels = new string[]
	{
		"left",
		"right"
	};
}
