Code/k/ECS/Game/Components/EntityProvider.cs
using Sandbox.k.ECS.Core;
using Sandbox.k.ECS.Extensions.Utils;

namespace Sandbox.k.ECS.Game.Components;

[Category( "k.ECS" )]
public class EntityProvider<T> : Component where T : struct
{
	[Property, InlineEditor] protected T _component { get; set; }

	private int _entityId;
	private bool _isInitialized;

	protected override void OnAwake()
	{
		base.OnAwake();
		Initialize();
	}

	public int GetEntity()
	{
		return _isInitialized ? _entityId : -1;
	}

	private int CreateEntity()
	{
		if ( _isInitialized )
		{
			OnEntityCreated( _entityId );
			return _entityId;
		}

		var entityLink = GetComponent<EntityProviderLink>();
		if ( entityLink.IsValid() )
		{
			_entityId = entityLink.EntityId;
			_isInitialized = true;
			OnEntityCreated( _entityId );
		
			Log.Info( $"ECS - Entity already created with ID: {_entityId}" );
			return _entityId;
		}

		entityLink = AddComponent<EntityProviderLink>();
		var world = World.Default;
		_entityId = world.CreateEntity();
		entityLink.EntityId = _entityId;
		_isInitialized = true;
		OnEntityCreated( _entityId );
		
		// Log.Info( $"ECS - Entity created with ID: {_entityId}" );
		return _entityId;
	}

	protected virtual void OnEntityCreated( int entityId )
	{
	}

	private void Initialize()
	{
		var entity = CreateEntity();
		// Log.Info( $"ECS - Linking component {typeof(T).Name} to entity {_entityId}" );
		entity.SetComponent( _component );
	}

	[Button]
	private void UpdateEntityComponent()
	{
		if ( !_isInitialized ) return;

		// Log.Info( $"ECS - Updating component {typeof(T).Name} for entity {_entityId}" );
		_entityId.SetComponent( _component );
	}
}