package protocolP2P;
import protocolP2P.Payload;
import tools.BytesArrayTools;
import localException.InternalError;
import localException.SizeError;
import localException.ProtocolError;
import localException.TransmissionError;

/** Representation of payload for discover request.
 * @author	Louis Royer
 * @author	Flavien Haas
 * @author	JS Auge
 * @version	1.0
 */
public class DiscoverRequest extends Payload {

	private String filename; 

	/** Constructor with filename (typically used by client). If filename is null, it is initialized with "".
	 * @param filename	Name of the file you want a server list of.
	 * @throws	InternalError
	 */
	public DiscoverRequest(String filename) throws InternalError {
		super(RequestResponseCode.DISCOVER_REQUEST);
		if (filename == null) {
			this.filename = "";
		} else {
			this.filename = filename;
		}
	}

	/** Constructor (typically used by server) with a byte[] parameter containing the Packet received.
	 * @param packet	the full Packet received
	 * @throws	SizeError
	 * @throws	InternalError
	 * @throws	ProtocolError
	 * @throws	TransmissionError
	 */
	protected DiscoverRequest(byte[] packet) throws SizeError, ProtocolError, InternalError, TransmissionError {
		super(packet);
		int size = getPayloadSize(packet);
		filename = BytesArrayTools.readString(packet, Payload.PAYLOAD_START_POSITION, size);
	}

	/** Returns a byte[] containing Packet with padding.
	 * This Packet is still incomplete and should not be send directly.
	 * ProtocolP2PPacket will use this method to generate the complete Packet.
	 * @return Packet with padding
	 * @throws	InternalError
	 */
	protected byte[] toPacket() throws InternalError {
		// compute total size
		int size = PAYLOAD_START_POSITION + filename.length();
		byte[] packet = new byte[size]; // java initialize all to zero
		// set request/response code
		packet[RequestResponseCode.RRCODE_POSITION] = requestResponseCode.codeValue;
		// set Payload size
		setPayloadSize(size - PAYLOAD_START_POSITION, packet);
		// write filename to Packet
		BytesArrayTools.write(packet, filename, PAYLOAD_START_POSITION);
		return packet;
	}

	/** Filename getter.
	 * @return	filename
	 */
	public String getFilename() {
		return filename;
	}

}
