package net.onrc.onos.ofcontroller.bgproute;

import java.util.Collections;
import java.util.List;

import net.floodlightcontroller.util.MACAddress;

import org.codehaus.jackson.annotate.JsonProperty;
import org.openflow.util.HexString;

public class Configuration {
	private long bgpdAttachmentDpid;
	private short bgpdAttachmentPort;
	private MACAddress bgpdMacAddress;
	private short vlan;
	private List<String> switches;
	private List<Interface> interfaces;
	private List<BgpPeer> peers;
	
	public Configuration() {
		// TODO Auto-generated constructor stub
	}

	public long getBgpdAttachmentDpid() {
		return bgpdAttachmentDpid;
	}

	@JsonProperty("bgpdAttachmentDpid")
	public void setBgpdAttachmentDpid(String bgpdAttachmentDpid) {
		this.bgpdAttachmentDpid = HexString.toLong(bgpdAttachmentDpid);
	}

	public short getBgpdAttachmentPort() {
		return bgpdAttachmentPort;
	}

	@JsonProperty("bgpdAttachmentPort")
	public void setBgpdAttachmentPort(short bgpdAttachmentPort) {
		this.bgpdAttachmentPort = bgpdAttachmentPort;
	}
	
	public MACAddress getBgpdMacAddress() {
		return bgpdMacAddress;
	}

	@JsonProperty("bgpdMacAddress")
	public void setBgpdMacAddress(String strMacAddress) {
		this.bgpdMacAddress = MACAddress.valueOf(strMacAddress);
	}

	public List<String> getSwitches() {
		return Collections.unmodifiableList(switches);
	}
	
	@JsonProperty("vlan")
	public void setVlan(short vlan) {
		this.vlan = vlan;
	}
	
	public short getVlan() {
		return vlan;
	}

	@JsonProperty("switches")
	public void setSwitches(List<String> switches) {
		this.switches = switches;
	}

	public List<Interface> getInterfaces() {
		return Collections.unmodifiableList(interfaces);
	}

	@JsonProperty("interfaces")
	public void setInterfaces(List<Interface> interfaces) {
		this.interfaces = interfaces;
	}
	
	public List<BgpPeer> getPeers() {
		return Collections.unmodifiableList(peers);
	}

	@JsonProperty("bgpPeers")
	public void setPeers(List<BgpPeer> peers) {
		this.peers = peers;
	}

}
