package network.message;


import java.util.Arrays;

import qora.block.Block;

import com.google.common.primitives.Bytes;
import com.google.common.primitives.Ints;

public class BlockMessage extends Message{

	private static final int HEIGHT_LENGTH = 4;
	
	private Block block;
	private int height;
	
	public BlockMessage(Block block)
	{
		super(BLOCK_TYPE);	
		
		this.block = block;
	}
	
	public Block getBlock()
	{
		return this.block;
	}
	
	public int getHeight()
	{
		return this.height;
	}
	
	public static BlockMessage parse(byte[] data) throws Exception
	{
		//PARSE HEIGHT
		byte[] heightBytes =  Arrays.copyOfRange(data, 0, HEIGHT_LENGTH);
		int height = Ints.fromByteArray(heightBytes);
		
		//PARSE BLOCK
		Block block = Block.parse(Arrays.copyOfRange(data, HEIGHT_LENGTH, data.length + 1));
		
		//CREATE MESSAGE
		BlockMessage message = new BlockMessage(block);
		message.height = height;
		return message;
	}
	
	public byte[] toBytes() 
	{
		byte[] data = new byte[0];
		
		//WRITE BLOCK HEIGHT
		byte[] heightBytes = Ints.toByteArray(this.block.getHeight());
		data = Bytes.concat(data, heightBytes);
		
		//WRITE BLOCK
		byte[] blockBytes = this.block.toBytes();
		data = Bytes.concat(data, blockBytes);
		
		//ADD CHECKSUM
		data = Bytes.concat(super.toBytes(), this.generateChecksum(data), data);
		
		return data;
	}	
	
	protected int getDataLength()
	{
		return HEIGHT_LENGTH + this.block.getDataLength();
	}
	
}
