﻿using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

namespace Fungus
{
	[EventHandlerInfo("Sprite",
	                  "Drag Completed",
	                  "The block will execute when the player drags an object and successfully drops it on a target object.")]
	[AddComponentMenu("")]
	public class DragCompleted : EventHandler
	{	
		[Tooltip("Draggable object to listen for drag events on")]
		public Draggable2D draggableObject;

		[Tooltip("Drag target object to listen for drag events on")]
		public Collider2D targetObject;
		
		// There's no way to poll if an object is touching another object, so
		// we have to listen to the callbacks and track the touching state ourselves.
		bool overTarget = false;
		
		public virtual bool IsOverTarget()
		{
			return overTarget;
		}
		
		public virtual void OnDragEntered(Draggable2D draggableObject, Collider2D targetObject)
		{
			if (this.targetObject != null &&
			    draggableObject == this.draggableObject &&
			    targetObject == this.targetObject)
			{
				overTarget = true;
			}
		}
		
		public virtual void OnDragExited(Draggable2D draggableObject, Collider2D targetObject)
		{
			if (this.targetObject != null &&
			    draggableObject == this.draggableObject &&
			    targetObject == this.targetObject)
			{
				overTarget = false;
			}
		}
		
		public virtual void OnDragCompleted(Draggable2D draggableObject)
		{
			if (draggableObject == this.draggableObject &&
			    overTarget)
			{
				// Assume that the player will have to do perform another drag and drop operation
				// to complete the drag again. This is necessary because we don't get an OnDragExited if the
				// draggable object is set to be inactive.
				overTarget = false;
				
				ExecuteBlock();
			}
		}

		public override string GetSummary()
		{
			string summary = "";
			if (draggableObject != null)
			{
				summary += "\nDraggable: " + draggableObject.name;
			}
			if (targetObject != null)
			{
				summary += "\nTarget: " + targetObject.name;
			}

			if (summary.Length == 0)
			{
				return "None";
			}

			return summary;
		}
	}
}