namespace Fusion.Addons.KCC
{
	using UnityEngine;
	/// 
	/// Custom wrapper/cache for fast property checks and synchronization.
	/// Direct changes on the Collider component or the Game Object won't propagate here.
	/// 
	public sealed partial class KCCCollider
	{
		// PUBLIC MEMBERS
		public GameObject      GameObject;
		public Transform       Transform;
		public CapsuleCollider Collider;
		public bool            IsSpawned;
		public bool            IsTrigger;
		public float           Radius;
		public float           Height;
		public int             Layer;
		// PUBLIC METHODS
		public void Update(KCC kcc)
		{
			KCCSettings settings = kcc.Settings;
			if (IsSpawned == false)
			{
				IsTrigger = settings.IsTrigger;
				Radius    = settings.Radius;
				Height    = settings.Height;
				Layer     = settings.ColliderLayer;
				GameObject = new GameObject("KCCCollider");
				GameObject.layer = settings.ColliderLayer;
				Transform = GameObject.transform;
				Transform.SetParent(kcc.Transform, false);
				Transform.localPosition = Vector3.zero;
				Transform.localRotation = Quaternion.identity;
				Transform.localScale    = Vector3.one;
				Collider = GameObject.AddComponent();
				Collider.direction = 1;
				Collider.isTrigger = settings.IsTrigger;
				Collider.radius    = settings.Radius;
				Collider.height    = settings.Height;
				Collider.center    = new Vector3(0.0f, settings.Height * 0.5f, 0.0f);
				IsSpawned = true;
			}
			if (IsTrigger != settings.IsTrigger)
			{
				IsTrigger = settings.IsTrigger;
				Collider.isTrigger = settings.IsTrigger;
			}
			if (Radius != settings.Radius)
			{
				Radius = settings.Radius;
				Collider.radius = settings.Radius;
			}
			if (Height != settings.Height)
			{
				Height = settings.Height;
				Collider.height = settings.Height;
				Collider.center = new Vector3(0.0f, settings.Height * 0.5f, 0.0f);
			}
			if (Layer != settings.ColliderLayer)
			{
				Layer = settings.ColliderLayer;
				GameObject.layer = settings.ColliderLayer;
			}
			OnUpdate(kcc);
		}
		public void Destroy()
		{
			if (IsSpawned == false)
				return;
			if (Collider != null)
			{
				Collider.enabled = false;
			}
			GameObject.Destroy(GameObject);
			GameObject = default;
			Transform  = default;
			Collider   = default;
			IsSpawned  = default;
			IsTrigger  = default;
			Radius     = default;
			Height     = default;
			Layer      = default;
			OnDestroy();
		}
		// PARTIAL METHODS
		partial void OnUpdate(KCC kcc);
		partial void OnDestroy();
	}
}