package sd.protocol;

import java.io.Serializable;

import sd.model.MessageType; 

/**
 * Contrato para todas as mensagens trocadas no simulador.
 * 
 * <p>Garante que mensagens podem ser identificadas e encaminhadas.
 * Extende Serializable para permitir envio via sockets.
 */
public interface MessageProtocol extends Serializable {

    /**
     * Tipo da mensagem, indicando o seu propósito.
     * @return tipo (ex: VEHICLE_TRANSFER, STATS_UPDATE)
     */
    MessageType getType();

    /**
     * Dados (payload) que esta mensagem transporta.
     * 
     * <p>Tipo depende do MessageType:
     * <ul>
     * <li>VEHICLE_TRANSFER → objeto Vehicle
     * <li>STATS_UPDATE → objeto de estatísticas
     * </ul>
     * 
     * @return payload (deve ser Serializable)
     */
    Object getPayload();

    /**
     * ID do nó (processo) que enviou a mensagem.
     * @return ID de origem (ex: "Cr1", "Cr5", "S")
     */
    String getSourceNode();

    /**
     * ID do nó de destino.
     * @return ID de destino (ex: "Cr2", "DashboardServer")
     */
    String getDestinationNode();
}