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
		@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);
		
		@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();
		
		//
		// IPv4 Addresses
		//
		@JsonProperty("ipv4addresses")
		@Adjacency(label="hasAddress")
		public Iterable<IIpv4Address> getIpv4Addresses();

		@JsonIgnore
		@GremlinGroovy("it.out('hasAddress').has('ipv4_address', ipv4Address)")
		public IIpv4Address getIpv4Address(@GremlinParam("ipv4Address") final int ipv4Address);
		
		@Adjacency(label="hasAddress")
		public void addIpv4Address(final IIpv4Address ipv4Address);
		
		@Adjacency(label="hasAddress")
		public void removeIpv4Address(final IIpv4Address ipv4Address);
		
/*		@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 IIpv4Address extends IBaseObject {
		
		@JsonProperty("ipv4")
		@Property("ipv4_address")
		public int getIpv4Address();
		
		@Property("ipv4_address")
		public void setIpv4Address(int ipv4Address);
		
		@JsonIgnore
		@GremlinGroovy("it.in('hasAddress')")
		public IDeviceObject getDevice();
	}
	
	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);
	}
}
