package net.onrc.onos.ofcontroller.core;

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;

import net.floodlightcontroller.core.web.serializers.IPv4Serializer;

/*
 * 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")
		@JsonSerialize(using=IPv4Serializer.class)
		public int getIpv4Address();
		
		@Property("ipv4_address")
		public void setIpv4Address(int ipv4Address);
		
		@JsonIgnore
		//@GremlinGroovy("it.in('hasAddress')")
		@Adjacency(label = "hasAddress", direction = Direction.IN)
		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("idleTimeout")
		@Property("idle_timeout")
		public Integer getIdleTimeout();

		@Property("idle_timeout")
		public void setIdleTimeout(Integer idleTimeout);

		@JsonProperty("hardTimeout")
		@Property("hard_timeout")
		public Integer getHardTimeout();

		@Property("hard_timeout")
		public void setHardTimeout(Integer hardTimeout);

		@JsonProperty("priority")
		@Property("priority")
		public Integer getPriority();

		@Property("priority")
		public void setPriority(Integer priority);

		@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);

		@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);

		@JsonProperty("idleTimeout")
		@Property("idle_timeout")
		public Integer getIdleTimeout();

		@Property("idle_timeout")
		public void setIdleTimeout(Integer idleTimeout);

		@JsonProperty("hardTimeout")
		@Property("hard_timeout")
		public Integer getHardTimeout();

		@Property("hard_timeout")
		public void setHardTimeout(Integer hardTimeout);

		@JsonProperty("priority")
		@Property("priority")
		public Integer getPriority();

		@Property("priority")
		public void setPriority(Integer priority);

		@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);
	}
}
