package net.onrc.onos.core.linkdiscovery.web;

import java.io.IOException;

import net.onrc.onos.core.linkdiscovery.ILinkDiscovery.LinkType;
import net.onrc.onos.core.linkdiscovery.Link;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.openflow.util.HexString;

/**
 * This class is both the datastructure and the serializer
 * for a link with the corresponding type of link.
 *
 * @author alexreimers
 */
@JsonSerialize(using = LinkWithType.class)
public class LinkWithType extends JsonSerializer<LinkWithType> {
    public long srcSwDpid;
    public short srcPort;
    public int srcPortState;
    public long dstSwDpid;
    public short dstPort;
    public int dstPortState;
    public LinkType type;

    // Do NOT delete this, it's required for the serializer
    public LinkWithType() {
    }

    public LinkWithType(Link link,
                        int srcPortState,
                        int dstPortState,
                        LinkType type) {
        this.srcSwDpid = link.getSrc();
        this.srcPort = link.getSrcPort();
        this.srcPortState = srcPortState;
        this.dstSwDpid = link.getDst();
        this.dstPort = link.getDstPort();
        this.dstPortState = dstPortState;
        this.type = type;
    }

    @Override
    public void serialize(LinkWithType lwt, JsonGenerator jgen, SerializerProvider arg2)
            throws IOException, JsonProcessingException {
        // You ****MUST*** use lwt for the fields as it's actually a different object.
        jgen.writeStartObject();
        jgen.writeStringField("src-switch", HexString.toHexString(lwt.srcSwDpid));
        jgen.writeNumberField("src-port", lwt.srcPort);
        jgen.writeNumberField("src-port-state", lwt.srcPortState);
        jgen.writeStringField("dst-switch", HexString.toHexString(lwt.dstSwDpid));
        jgen.writeNumberField("dst-port", lwt.dstPort);
        jgen.writeNumberField("dst-port-state", lwt.dstPortState);
        jgen.writeStringField("type", lwt.type.toString());
        jgen.writeEndObject();
    }

    @Override
    public Class<LinkWithType> handledType() {
        return LinkWithType.class;
    }
}
