package org.kne.cloud.network.srv6;

import java.io.EOFException;
import java.io.IOException;
import java.io.Serializable;
import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.nio.charset.Charset;

import org.kne.cloud.network.MultiProtocolSocketAddress;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class JsonDataPacket extends KLALBRoutingProtocolPacket implements Serializable{

	private Object userCallback;
	
	
	public Object getUserCallback() {
		return userCallback;
	}

	public void setUserCallback(Object userCallback) {
		this.userCallback = userCallback;
	}

	@Override
	protected long getHeaderSize() {
		return HEADER_LENGTH;
	}

	private String data;

	private static final int HEADER_LENGTH=3;

	private static Gson gson;
	static{
		GsonBuilder gb=new GsonBuilder();
		MultiProtocolSocketAddress.registerToGsonBuilder(gb);
		gson=gb.create();
	}
	
	public String getData() {
		return data;
	}

	public KLALBRoutingProtocolJsonData getDecodedData() {
		return gson.fromJson(data,KLALBRoutingProtocolJsonData.class );
	}
	
	public JsonDataPacket(String data) {
		super(JSON_DATA);
		this.data=data;
	}
	
	public JsonDataPacket(KLALBRoutingProtocolJsonData data) {
		this(gson.toJson(data));
	}

	
	public JsonDataPacket(ByteBuffer bb) {
		super(bb);
	}

	
	@Override
	public String toString() {
		return "JsonDATA "+getData();
	}
	
	
	
	@Override
	public void writeToChannel(WritableByteChannel dto) throws IOException {
		byte[]bta=data.getBytes(Charset.forName("UTF-8"));
		getHeader().putChar(1,(char) bta.length);
		super.writeToChannel(dto);
		dto.write(ByteBuffer.wrap(bta));
	}

	@Override
	public void readFromChannel(ReadableByteChannel din) throws IOException {
		super.readFromChannel(din);
		int lth=getHeader().getChar(1);
		byte[]b=new byte[lth];
		ByteBuffer wp= ByteBuffer.wrap(b);
				 while(wp.hasRemaining()){
		if(din.read(wp)==-1) {
			throw new EOFException();
		}
			}
				 data=new String(b, Charset.forName("UTF-8"));
	}

	@Override
	public long getTotalLength() {
		return HEADER_LENGTH+data.getBytes(Charset.forName("UTF-8")).length;
	}


}
