package net.onrc.onos.ofcontroller.core;

import net.onrc.onos.ofcontroller.flowmanager.web.DatapathSummarySerializer;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.annotate.JsonSerialize;

import com.tinkerpop.blueprints.Direction;
import com.tinkerpop.frames.Adjacency;
import com.tinkerpop.frames.Property;
import com.tinkerpop.frames.annotations.gremlin.GremlinGroovy;
import com.tinkerpop.frames.annotations.gremlin.GremlinParam;
import com.tinkerpop.frames.VertexFrame;

/*
 * This is the interfaces to make the objects for Cassandra DB.
 * They are interfaces, but it is also implementation,
 * so this handles various control to the objects.  
 * Please take a look at tinkerpop/frames annotation doc to understand more.
 */
public interface INetMapTopologyObjects {
	
public interface IBaseObject extends VertexFrame {
	
	@JsonProperty("state")
	@Property("state")
	public String getState();
	
	@Property("state")
	public void setState(final String state);
	
	@JsonIgnore
	@Property("type")
	public String getType();
	@Property("type")
	public void setType(final String type);
	
}
	
public interface ISwitchObject extends IBaseObject{
		
		@JsonProperty("dpid")
		@Property("dpid")
		public String getDPID();
		
		@Property("dpid")
		public void setDPID(String dpid);
				
		@JsonProperty("ports")
		@Adjacency(label="on")
		public Iterable<IPortObject> getPorts();

// Requires Frames 2.3.0		
		@JsonIgnore
		@GremlinGroovy("it.out('on').has('number',port_num)")
		public IPortObject getPort(@GremlinParam("port_num") final short port_num);
		
		@Adjacency(label="on")
		public void addPort(final IPortObject port);
		
		@Adjacency(label="on")
		public void removePort(final IPortObject port);
		
		@JsonIgnore
		@GremlinGroovy("it.out('on').out('host')")
		public Iterable<IDeviceObject> getDevices();
		
		@JsonIgnore
		@Adjacency(label="switch",direction = Direction.IN)
		public Iterable<IFlowEntry> getFlowEntries();

	}
	
	public interface IPortObject extends IBaseObject{
				
		@JsonProperty("number")
		@Property("number")
		public Short getNumber();
		
		@JsonIgnore
		@Property("port_id")
		public void setPortId(String id);
		
		@JsonIgnore
		@Property("port_id")
		public String getPortId();
		
		@Property("number")
		public void setNumber(Short n);
		
		@JsonProperty("desc")
		@Property("desc")
		public String getDesc();
		
		@Property("desc")
		public void setDesc(String s);
		
		@JsonIgnore
		@Property("port_state")
		public Integer getPortState();
		
		@Property("port_state")
		public void setPortState(Integer s);
		
		@JsonIgnore
//		@GremlinGroovy("it.in('on')")
		@Adjacency(label="on",direction = Direction.IN)
		public ISwitchObject getSwitch();
				
		@JsonProperty("devices")
		@Adjacency(label="host")
		public Iterable<IDeviceObject> getDevices();
		
		@Adjacency(label="host")
		public void setDevice(final IDeviceObject device);
		
		@Adjacency(label="host")
		public void removeDevice(final IDeviceObject device);
		
		@JsonIgnore
		@Adjacency(label="inport",direction = Direction.IN)
		public Iterable<IFlowEntry> getInFlowEntries();
		
		@JsonIgnore
		@Adjacency(label="outport",direction = Direction.IN)
		public Iterable<IFlowEntry> getOutFlowEntries();
		
		@JsonIgnore
		@Adjacency(label="link")
		public Iterable<IPortObject> getLinkedPorts();

		@JsonIgnore
		@Adjacency(label="link",direction = Direction.IN)
		public Iterable<IPortObject> getReverseLinkedPorts();
		
		@Adjacency(label="link")
		public void removeLink(final IPortObject dest_port);
		
		@Adjacency(label="link")
		public void setLinkPort(final IPortObject dest_port);			
		
//		@JsonIgnore
//		@Adjacency(label="link")
//		public Iterable<ILinkObject> getLinks();
	}
	
	public interface IDeviceObject extends IBaseObject {
		
		@JsonProperty("mac")
		@Property("dl_addr")
		public String getMACAddress();
		@Property("dl_addr")
		public void setMACAddress(String macaddr);
		
		@JsonProperty("ipv4")
		@Property("nw_addr")
		public String getIPAddress();
		@Property("nw_addr")
		public void setIPAddress(String ipaddr);
		
		@JsonIgnore
		@Adjacency(label="host",direction = Direction.IN)
		public Iterable<IPortObject> getAttachedPorts();
			
		@JsonIgnore
		@Adjacency(label="host",direction=Direction.IN)
		public void setHostPort(final IPortObject port);
		
		@JsonIgnore
		@Adjacency(label="host",direction=Direction.IN)
		public void removeHostPort(final IPortObject port);
		
		@JsonIgnore
		@GremlinGroovy("it.in('host').in('on')")
		public Iterable<ISwitchObject> getSwitch();
		
/*		@JsonProperty("dpid")
		@GremlinGroovy("_().in('host').in('on').next().getProperty('dpid')")
		public Iterable<String> getSwitchDPID();
		
		@JsonProperty("number")
		@GremlinGroovy("_().in('host').transform{it.number}")
		public Iterable<Short> getPortNumber();
		
		@JsonProperty("AttachmentPoint")
		@GremlinGroovy("_().in('host').in('on').path(){it.number}{it.dpid}")
		public Iterable<SwitchPort> getAttachmentPoints();*/
	}

public interface IFlowPath extends IBaseObject {
		@JsonProperty("flowId")
		@Property("flow_id")
		public String getFlowId();

		@Property("flow_id")
		public void setFlowId(String flowId);

		@JsonProperty("installerId")
		@Property("installer_id")
		public String getInstallerId();

		@Property("installer_id")
		public void setInstallerId(String installerId);

		@JsonProperty("flowPathType")
		@Property("flow_path_type")
		public String getFlowPathType();

		@Property("flow_path_type")
		public void setFlowPathType(String flowPathType);

		@JsonProperty("flowPathUserState")
		@Property("user_state")
		public String getFlowPathUserState();

		@Property("user_state")
		public void setFlowPathUserState(String userState);

		@JsonProperty("flowPathFlags")
		@Property("flow_path_flags")
		public Long getFlowPathFlags();

		@Property("flow_path_flags")
		public void setFlowPathFlags(Long flowPathFlags);

		@JsonProperty("srcDpid")
		@Property("src_switch")
		public String getSrcSwitch();

		@Property("src_switch")
		public void setSrcSwitch(String srcSwitch);

		@JsonProperty("srcPort")
		@Property("src_port")
		public Short getSrcPort();

		@Property("src_port")
		public void setSrcPort(Short srcPort);

		@JsonProperty("dstDpid")
		@Property("dst_switch")
		public String getDstSwitch();

		@Property("dst_switch")
		public void setDstSwitch(String dstSwitch);

		@JsonProperty("dstPort")
		@Property("dst_port")
		public Short getDstPort();

		@Property("dst_port")
		public void setDstPort(Short dstPort);

		@JsonProperty("dataPath")
		@JsonSerialize(using=DatapathSummarySerializer.class)
		@Property("data_path_summary")
		public String getDataPathSummary();

		@Property("data_path_summary")
		public void setDataPathSummary(String dataPathSummary);

		@JsonIgnore
		@Adjacency(label="flow", direction=Direction.IN)
		public Iterable<IFlowEntry> getFlowEntries();

		@Adjacency(label="flow", direction=Direction.IN)
		public void addFlowEntry(final IFlowEntry flowEntry);

		@Adjacency(label="flow", direction=Direction.IN)
		public void removeFlowEntry(final IFlowEntry flowEntry);

		//
		// Matching fields
		//
		@JsonIgnore
		@Property("matchSrcMac")
		public String getMatchSrcMac();

		@Property("matchSrcMac")
		public void setMatchSrcMac(String matchSrcMac);

		@JsonIgnore
		@Property("matchDstMac")
		public String getMatchDstMac();

		@Property("matchDstMac")
		public void setMatchDstMac(String matchDstMac);

		@JsonIgnore
		@Property("matchEthernetFrameType")
		public Short getMatchEthernetFrameType();

		@Property("matchEthernetFrameType")
		public void setMatchEthernetFrameType(Short matchEthernetFrameType);

		@JsonIgnore
		@Property("matchVlanId")
		public Short getMatchVlanId();

		@Property("matchVlanId")
		public void setMatchVlanId(Short matchVlanId);

		@JsonIgnore
		@Property("matchVlanPriority")
		public Byte getMatchVlanPriority();

		@Property("matchVlanPriority")
		public void setMatchVlanPriority(Byte matchVlanPriority);

		@JsonIgnore
		@Property("matchSrcIPv4Net")
		public String getMatchSrcIPv4Net();

		@Property("matchSrcIPv4Net")
		public void setMatchSrcIPv4Net(String matchSrcIPv4Net);

		@JsonIgnore
		@Property("matchDstIPv4Net")
		public String getMatchDstIPv4Net();

		@Property("matchDstIPv4Net")
		public void setMatchDstIPv4Net(String matchDstIPv4Net);

		@JsonIgnore
		@Property("matchIpProto")
		public Byte getMatchIpProto();

		@Property("matchIpProto")
		public void setMatchIpProto(Byte matchIpProto);

		@JsonIgnore
		@Property("matchIpToS")
		public Byte getMatchIpToS();

		@Property("matchIpToS")
		public void setMatchIpToS(Byte matchIpToS);

		@JsonIgnore
		@Property("matchSrcTcpUdpPort")
		public Short getMatchSrcTcpUdpPort();

		@Property("matchSrcTcpUdpPort")
		public void setMatchSrcTcpUdpPort(Short matchSrcTcpUdpPort);

		@JsonIgnore
		@Property("matchDstTcpUdpPort")
		public Short getMatchDstTcpUdpPort();

		@Property("matchDstTcpUdpPort")
		public void setMatchDstTcpUdpPort(Short matchDstTcpUdpPort);

		//
		// Action-related fields
		//
		@Property("actions")
		public String getActions();

		@Property("actions")
		public void setActions(String actionsStr);

		//
		// Other fields
		//
		@JsonIgnore
		@GremlinGroovy("it.in('flow').out('switch')")
		public Iterable<ISwitchObject> getSwitches();
		
		@JsonIgnore
		@Property("state")
		public String getState();
	}

public interface IFlowEntry extends IBaseObject {
		@Property("flow_entry_id")
		public String getFlowEntryId();

		@Property("flow_entry_id")
		public void setFlowEntryId(String flowEntryId);

		@Property("switch_dpid")
		public String getSwitchDpid();

		@Property("switch_dpid")
		public void setSwitchDpid(String switchDpid);

		@Property("user_state")
		public String getUserState();

		@Property("user_state")
		public void setUserState(String userState);

		@Property("switch_state")
		public String getSwitchState();

		@Property("switch_state")
		public void setSwitchState(String switchState);

		@Property("error_state_type")
		public String getErrorStateType();

		@Property("error_state_type")
		public void setErrorStateType(String errorStateType);

		@Property("error_state_code")
		public String getErrorStateCode();

		@Property("error_state_code")
		public void setErrorStateCode(String errorStateCode);

		//
		// Matching fields
		//
		@Property("matchInPort")
		public Short getMatchInPort();

		@Property("matchInPort")
		public void setMatchInPort(Short matchInPort);

		@Property("matchSrcMac")
		public String getMatchSrcMac();

		@Property("matchSrcMac")
		public void setMatchSrcMac(String matchSrcMac);

		@Property("matchDstMac")
		public String getMatchDstMac();

		@Property("matchDstMac")
		public void setMatchDstMac(String matchDstMac);

		@Property("matchEthernetFrameType")
		public Short getMatchEthernetFrameType();

		@Property("matchEthernetFrameType")
		public void setMatchEthernetFrameType(Short matchEthernetFrameType);

		@Property("matchVlanId")
		public Short getMatchVlanId();

		@Property("matchVlanId")
		public void setMatchVlanId(Short matchVlanId);

		@Property("matchVlanPriority")
		public Byte getMatchVlanPriority();

		@Property("matchVlanPriority")
		public void setMatchVlanPriority(Byte matchVlanPriority);

		@Property("matchSrcIPv4Net")
		public String getMatchSrcIPv4Net();

		@Property("matchSrcIPv4Net")
		public void setMatchSrcIPv4Net(String matchSrcIPv4Net);

		@Property("matchDstIPv4Net")
		public String getMatchDstIPv4Net();

		@Property("matchDstIPv4Net")
		public void setMatchDstIPv4Net(String matchDstIPv4Net);

		@Property("matchIpProto")
		public Byte getMatchIpProto();

		@Property("matchIpProto")
		public void setMatchIpProto(Byte matchIpProto);

		@Property("matchIpToS")
		public Byte getMatchIpToS();

		@Property("matchIpToS")
		public void setMatchIpToS(Byte matchIpToS);

		@Property("matchSrcTcpUdpPort")
		public Short getMatchSrcTcpUdpPort();

		@Property("matchSrcTcpUdpPort")
		public void setMatchSrcTcpUdpPort(Short matchSrcTcpUdpPort);

		@Property("matchDstTcpUdpPort")
		public Short getMatchDstTcpUdpPort();

		@Property("matchDstTcpUdpPort")
		public void setMatchDstTcpUdpPort(Short matchDstTcpUdpPort);

		//
		// Action-related fields
		//
		@Property("actionOutputPort")
		public Short getActionOutputPort();

		@Property("actionOutputPort")
		public void setActionOutputPort(Short actionOutputPort);

		@Property("actions")
		public String getActions();

		@Property("actions")
		public void setActions(String actionsStr);

		//
		// Other fields
		//
		@Adjacency(label="flow")
		public IFlowPath getFlow();

		@Adjacency(label="flow")
		public void setFlow(IFlowPath flow);

		@Adjacency(label="switch")
		public ISwitchObject getSwitch();

		@Adjacency(label="switch")
		public void setSwitch(ISwitchObject sw);

		@Adjacency(label="inport")
		public IPortObject getInPort();

		@Adjacency(label="inport")
		public void setInPort(IPortObject port);

		@Adjacency(label="outport")
		public IPortObject getOutPort();

		@Adjacency(label="outport")
		public void setOutPort(IPortObject port);
	}
}
