package net.floodlightcontroller.flowcache.web;

import java.io.IOException;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DatapathSummarySerializer extends JsonSerializer<String>{
	static Logger log = LoggerFactory.getLogger(DatapathSummarySerializer.class);
	
	@Override
	public void serialize(String datapathSummary, JsonGenerator jGen,
			SerializerProvider serializer) throws IOException,
			JsonProcessingException {
		
		String[] flowEntries = datapathSummary.split(";");
		if (flowEntries.length < 2){
			log.debug("datapathSummary string to short to parse: {}", 
					datapathSummary);
			jGen.writeStartObject();
			jGen.writeEndObject();
			return;
		}
		
		String[] srcFlowEntry = flowEntries[0].split("/");
		String[] dstFlowEntry = flowEntries[flowEntries.length - 1].split("/");
		if (srcFlowEntry.length != 3 || dstFlowEntry.length != 3){
			log.debug("Malformed datapathSummary string: {}", datapathSummary);
			jGen.writeStartObject();
			jGen.writeEndObject();
			return;
		}
		
		jGen.writeStartObject();
		
		/*
		jGen.writeObjectFieldStart("srcPort");
		jGen.writeObjectFieldStart("dpid");
		jGen.writeStringField("value", srcFlowEntry[1]);
		jGen.writeEndObject();
		jGen.writeObjectFieldStart("port");
		jGen.writeStringField("value", srcFlowEntry[0]);
		jGen.writeEndObject();
		jGen.writeEndObject();
		
		jGen.writeObjectFieldStart("dstPort");
		jGen.writeObjectFieldStart("dpid");
		jGen.writeStringField("value", srcFlowEntry[1]);
		jGen.writeEndObject();
		jGen.writeObjectFieldStart("port");
		jGen.writeStringField("value", srcFlowEntry[2]);
		jGen.writeEndObject();
		jGen.writeEndObject();
		*/
		jGen.writeArrayFieldStart("flowEntries");
		
		for (String flowEntryString : flowEntries){
			String[] flowEntry = flowEntryString.split("/");
			if (flowEntry.length != 3){
				log.debug("Malformed datapathSummary string: {}", datapathSummary);
				jGen.writeStartObject();
				jGen.writeEndObject();
				continue;
			}
			
			jGen.writeStartObject();
			jGen.writeObjectFieldStart("dpid");
			jGen.writeStringField("value", flowEntry[1]);
			jGen.writeEndObject();
			jGen.writeEndObject();
		}
		
		jGen.writeEndArray();
		
		jGen.writeEndObject();
	}

}
