using Godot;
using System;
using Cirno.Scripts;
using Cirno.Scripts.Components.FSM._3DPlayer;
using Godot.Collections;

[Tool]
public partial class TriggerArea : Area3D
{
	[Export] public string Target { get; private set; }
	[Export] public string TargetFunc { get; private set; }
	[Export] public string TargetName { get; private set; }

	[Export] public ActivationType ActivationType { get; private set; } = ActivationType.Toggle;

	public enum TriggerStates
	{
		READY,
		USED
	}
	
	private TriggerStates _triggerState = TriggerStates.READY;

	private float _timeout = 0f;
	private Node _lastActivator;

	public void _func_godot_apply_properties(Dictionary<string, string> props)
	{
		Target = props["target"];
		TargetFunc = props["targetfunc"];
		TargetName = props["targetname"];
		if (props.TryGetValue("activationtype", out var type))
		{
			var t = Enum.TryParse(type, true, out ActivationType activationType);
			if (t)
			{
				ActivationType = activationType;
			}
		}
		// TODO: Oneshot
	}

	public void _on_ent_entered(Node ent)
	{
		GD.Print($"Trigger entered by {ent.Name}");
		if (_triggerState is TriggerStates.READY)
		{
			if (ent is IsoPlayerFSMProxy)
			{
				GD.Print($"Entity {ent} is player, trying to use");
				Use();
			}
			else
			{
				GD.Print($"{ent.Name} was not interaction controller");
			}
		}
		else
		{
			GD.Print("Trigger was not ready");
		}
	}

	public void Use()
	{
		if (_triggerState is TriggerStates.READY)
		{
			_triggerState = TriggerStates.USED;
			ToggleCollision(false);
			
			UseTargets(this, Target);
		}
	}

	private void UseTargets(Node activator, string target)
	{
		GD.Print($"Trying to use targets called: {target}");
		var targetList = GetTree().GetNodesInGroup(target);
		foreach (var t in targetList)
		{
			//string f;
			GD.Print($"Trying to use {t.Name}");
			if (t is IActivable activable)
			{
				GD.Print($"Activating {t.Name}");
				activable.Activate(ActivationType);
			}
		}
	}

	private void ToggleCollision(bool toggle)
	{
		
	}
	
	// Called when the node enters the scene tree for the first time.
	public override void _Ready()
	{
		if (Engine.IsEditorHint()) return;
		
		//TBGAME.set_targetname(self, targetname)
		if (!string.IsNullOrEmpty(TargetName))
		{
			this.AddToGroup(TargetName);
		}
	}

	public TriggerArea()
	{
		Monitoring = true;
		Monitorable = false;
		BodyEntered += _on_ent_entered;
		//AreaEntered += _on_ent_entered;
	}
	
}
