using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
namespace GraphProcessor
{
	/// 
	/// Tell that this field is will generate an input port
	/// 
	[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
	public class InputAttribute : Attribute
	{
		public string		name;
		public bool			allowMultiple = false;
		/// 
		/// Mark the field as an input port
		/// 
		/// display name
		/// is connecting multiple edges allowed
		public InputAttribute(string name = null, bool allowMultiple = false)
		{
			this.name = name;
			this.allowMultiple = allowMultiple;
		}
	}
	/// 
	/// Tell that this field is will generate an output port
	/// 
	[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
	public class OutputAttribute : Attribute
	{
		public string		name;
		public bool			allowMultiple = true;
		/// 
		/// Mark the field as an output port
		/// 
		/// display name
		/// is connecting multiple edges allowed
		public OutputAttribute(string name = null, bool allowMultiple = true)
		{
			this.name = name;
			this.allowMultiple = allowMultiple;
		}
	}
	/// 
	/// Creates a vertical port instead of the default horizontal one
	/// 
	[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
	public class VerticalAttribute : Attribute
	{
	}
	/// 
	/// Register the node in the NodeProvider class. The node will also be available in the node creation window.
	/// 
	[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
	public class NodeMenuItemAttribute : Attribute
	{
		public string	menuTitle;
		public Type		onlyCompatibleWithGraph;
		/// 
		/// Register the node in the NodeProvider class. The node will also be available in the node creation window.
		/// 
		/// Path in the menu, use / as folder separators
		public NodeMenuItemAttribute(string menuTitle = null, Type onlyCompatibleWithGraph = null)
		{
			this.menuTitle = menuTitle;
			this.onlyCompatibleWithGraph = onlyCompatibleWithGraph;
		}
	}
	/// 
	/// Set a custom drawer for a field. It can then be created using the FieldFactory
	/// 
	[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
	[Obsolete("You can use the standard Unity CustomPropertyDrawer instead.")]
	public class FieldDrawerAttribute : Attribute
	{
		public Type		fieldType;
		/// 
		/// Register a custom view for a type in the FieldFactory class
		/// 
		/// 
		public FieldDrawerAttribute(Type fieldType)
		{
			this.fieldType = fieldType;
		}
	}
	/// 
	/// Allow you to customize the input function of a port
	/// 
	[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
	public class CustomPortInputAttribute : Attribute
	{
		public string	fieldName;
		public Type		inputType;
		public bool		allowCast;
		/// 
		/// Allow you to customize the input function of a port.
		/// See CustomPortsNode example in Samples.
		/// 
		/// local field of the node
		/// type of input of the port
		/// if cast is allowed when connecting an edge
		public CustomPortInputAttribute(string fieldName, Type inputType, bool allowCast = true)
		{
			this.fieldName = fieldName;
			this.inputType = inputType;
			this.allowCast = allowCast;
		}
	}
	/// 
	/// Allow you to customize the input function of a port
	/// 
	[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
	public class CustomPortOutputAttribute : Attribute
	{
		public string	fieldName;
		public Type		outputType;
		public bool		allowCast;
		/// 
		/// Allow you to customize the output function of a port.
		/// See CustomPortsNode example in Samples.
		/// 
		/// local field of the node
		/// type of input of the port
		/// if cast is allowed when connecting an edge
		public CustomPortOutputAttribute(string fieldName, Type outputType, bool allowCast = true)
		{
			this.fieldName = fieldName;
			this.outputType = outputType;
			this.allowCast = allowCast;
		}
	}
	/// 
	/// Allow you to modify the generated port view from a field. Can be used to generate multiple ports from one field.
	/// 
	[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
	public class CustomPortBehaviorAttribute : Attribute
	{
		public string		fieldName;
		/// 
		/// Allow you to modify the generated port view from a field. Can be used to generate multiple ports from one field.
		/// You must add this attribute on a function of this signature
		/// 
		/// IEnumerable<PortData> MyCustomPortFunction(List<SerializableEdge> edges);
		/// 
		/// 
		/// local node field name
		public CustomPortBehaviorAttribute(string fieldName)
		{
			this.fieldName = fieldName;
		}
	}
	/// 
	/// Allow to bind a method to generate a specific set of ports based on a field type in a node
	/// 
	[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
	public class CustomPortTypeBehavior : Attribute
	{
		/// 
		/// Target type
		/// 
		public Type type;
		public CustomPortTypeBehavior(Type type)
		{
			this.type = type;
		}
	}
	/// 
	/// Allow you to have a custom view for your stack nodes
	/// 
	[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
	public class CustomStackNodeView : Attribute
	{
		public Type	stackNodeType;
		/// 
		/// Allow you to have a custom view for your stack nodes
		/// 
		/// The type of the stack node you target
		public CustomStackNodeView(Type stackNodeType)
		{
			this.stackNodeType = stackNodeType;
		}
	}
	[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
	public class VisibleIf : Attribute
	{
		public string fieldName;
		public object value;
		public VisibleIf(string fieldName, object value)
		{
			this.fieldName = fieldName;
			this.value = value;
		}
	}
	[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
	public class ShowInInspector : Attribute
	{
		public bool showInNode;
		public ShowInInspector(bool showInNode = false)
		{
			this.showInNode = showInNode;
		}
	}
	
	[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
	public class ShowAsDrawer : Attribute
	{
	}
	
	[AttributeUsage(AttributeTargets.Field)]
	public class SettingAttribute : Attribute
	{
		public string name;
		public SettingAttribute(string name = null)
		{
			this.name = name;
		}
	}
	[AttributeUsage(AttributeTargets.Method)]
	public class IsCompatibleWithGraph : Attribute {}
}