using Godot;
using System;
using System.Collections.Generic;
using System.Linq;
using BITKit.Core.Entites;
namespace  BITKit;
/// <summary>
/// 用于Godot的ECS.Entity实现
/// </summary>
public partial class Entity : Node,IEntity
{
	/// <summary>
	/// 类型组件的缓存
	/// </summary>
	private readonly Dictionary<Type,IEntityComponent> TypeComponents=new ();
	/// <summary>
	/// IEntityService的缓存
	/// </summary>
	private  IEntitiesService _entitiesService;
	/// <summary>
	/// 所有EntityComponent
	/// </summary>
	private IEntityComponent[] _components;
	IEntityComponent[] IEntity.Components => _components;
	/// <summary>
	/// IEntity.Id实现
	/// </summary>
	public ulong Id { get; private set; }
	/// <summary>
	/// 加载所有EntityComponent的内部实现
	/// </summary>
	public override void _Ready()
	{
		List<IEntityComponent> entityComponents = new();
		Id = GetInstanceId();
		_entitiesService = DI.Get<IEntitiesService>();
		foreach (var x in MathNode.GetAllNode(this))
		{
			GetInstanceId();
			if (x is not IEntityComponent component) continue;
			component.Entity = this;
			TypeComponents.TryAdd(x.GetType(),component);
			BIT4Log.Log<Entity>($"已加载组件:{x.Name}");
			component.OnAwake();
			entityComponents.Add(component);
		}
		foreach (var component in TypeComponents.Values)
		{
			component.OnStart();
		}
		_entitiesService.Register(this);
		this._components = entityComponents.ToArray();
	}
	public bool TryGetComponent<T>(out T component) where T : IEntityComponent
	{
		if (TypeComponents.TryGetValue(typeof(T), out var iComponent) && iComponent is T _component)
		{
			component = _component;
			return true;
		}
		component = default;
		return false;
	}
	protected override void Dispose(bool disposing)
	{
		base.Dispose(disposing);
		if (disposing)
		{
			_entitiesService.UnRegister(this);
		}
	}
	
	public bool RegisterComponent<T>(T component) where T : IEntityComponent
	{
		return TypeComponents.TryAdd(typeof(T), component);
	}
}
