class BotEventEntityAttached : BotEventBase { };

class BotEventEntityDetached : BotEventBase { };

class BotTestAttachAndDropCycle extends BotStateBase
{
	EntityAI m_Entity;
	ref BotTestAttachAndDropCycle_Detaching m_Detaching;
	ref BotTestAttachAndDropCycle_Attaching m_Attaching;

	void BotTestAttachAndDropCycle (Bot bot = NULL, BotStateBase parent = NULL)
	{
		// setup nested state machine
		m_FSM = new BotFSM(this); // @NOTE: set owner of the submachine fsm

		m_Detaching = new BotTestAttachAndDropCycle_Detaching(m_Bot, this);
		m_Attaching = new BotTestAttachAndDropCycle_Attaching(m_Bot, this);
		
		// events
		BotEventBase __EntAtt__ = new BotEventEntityAttached;
		BotEventBase __EntDet__ = new BotEventEntityDetached;

		// transitions
		m_FSM.AddTransition(new BotTransition(   m_Detaching, __EntDet__, m_Attaching));
		m_FSM.AddTransition(new BotTransition(   m_Attaching, __EntAtt__, m_Detaching));

		m_FSM.SetInitialState(m_Detaching);
	}

	override void OnEntry (BotEventBase e)
	{
		m_Entity = m_Owner.GetInventory().CreateAttachment("TaloonBag_Orange");
		m_Detaching.m_Entity = m_Entity;
		m_Attaching.m_Entity = m_Entity;

		super.OnEntry(e);
	}

	override void OnExit (BotEventBase e)
	{
		m_Entity = null;

		super.OnExit(e);
	}

	override void OnUpdate (float dt)
	{
		super.OnUpdate(dt);
	}
};

class BotTestAttachAndDropCycle_Detaching extends BotStateBase
{
	EntityAI m_Entity;

	override void OnEntry (BotEventBase e)
	{
		super.OnEntry(e);
	}

	override void OnAbort (BotEventBase e) { super.OnAbort(e); }

	override void OnExit (BotEventBase e)
	{
		super.OnExit(e);
	}

	override void OnUpdate (float dt)
	{
		if (m_Entity)
		{
			botDebugPrint("[bot] + " + m_Owner + " drop item=" + m_Entity + " bot=" + m_Owner);
			
			m_Owner.PredictiveDropEntity(m_Entity);

			InventoryLocation loc = new InventoryLocation;
			if (m_Entity.GetInventory().GetCurrentInventoryLocation(loc))
			{
				if (loc.GetType() == InventoryLocationType.GROUND)
				{
					m_Bot.ProcessEvent(new BotEventEntityDetached(m_Owner, m_Entity));
				}
			}
		}
	}
};

class BotTestAttachAndDropCycle_Attaching extends BotStateBase
{
	EntityAI m_Entity;

	override void OnEntry (BotEventBase e)
	{
		super.OnEntry(e);
	}

	override void OnAbort (BotEventBase e) { super.OnAbort(e); }

	override void OnExit (BotEventBase e)
	{
		super.OnExit(e);
	}

	override void OnUpdate (float dt)
	{
		if (m_Entity)
		{
			botDebugPrint("[bot] + " + m_Owner + " att item=" + m_Entity + " bot=" + m_Owner);
			
			if (m_Owner.GetInventory().CanAddAttachment(m_Entity))
			{
				m_Owner.PredictiveTakeEntityAsAttachment(m_Entity);
	
				InventoryLocation loc = new InventoryLocation;
				if (m_Entity.GetInventory().GetCurrentInventoryLocation(loc))
				{
					if (loc.GetType() == InventoryLocationType.ATTACHMENT)
					{
						m_Bot.ProcessEvent(new BotEventEntityAttached(m_Owner, m_Entity));
					}
				}
			}
		}
	}
};

