package sd.dashboard;

import sd.model.MessageType;
import sd.protocol.MessageProtocol;

/**
 * Implementação concreta do protocolo de mensagens destinada ao transporte de telemetria.
 * <p>
 * Esta classe atua como um envelope especializado para o envio de dados estatísticos
 * (encapsulados em {@link StatsUpdatePayload}) dos nós operacionais (Interseções, Coordenador)
 * para o servidor de Dashboard centralizado.
 * <p>
 * Diferencia-se das mensagens de controlo genéricas por ter o destino fixado no
 * "DashboardServer" e um tipo de mensagem imutável ({@code STATS_UPDATE}).
 */
public class StatsMessage implements MessageProtocol {
    
    private static final long serialVersionUID = 1L;
    
    private final String sourceNode;
    private final String destinationNode;
    private final StatsUpdatePayload payload;
    
    /**
     * Cria uma nova mensagem de estatística.
     *
     * @param sourceNode O ID do nó que gerou as estatísticas (ex: "Cr1", "ExitNode").
     * @param payload O objeto DTO contendo os dados estatísticos brutos ou agregados.
     */
    public StatsMessage(String sourceNode, StatsUpdatePayload payload) {
        this.sourceNode = sourceNode;
        this.destinationNode = "DashboardServer"; // Destino implícito e fixo
        this.payload = payload;
    }
    
    /**
     * Retorna o tipo da mensagem, que identifica semanticamente o conteúdo para o recetor.
     * @return Sempre {@link MessageType#STATS_UPDATE}.
     */
    @Override
    public MessageType getType() {
        return MessageType.STATS_UPDATE;
    }
    
    /**
     * Obtém a carga útil da mensagem.
     * @return O objeto {@link StatsUpdatePayload} associado.
     */
    @Override
    public Object getPayload() {
        return payload;
    }
    
    /**
     * Identifica a origem da mensagem.
     * @return O ID do nó remetente.
     */
    @Override
    public String getSourceNode() {
        return sourceNode;
    }
    
    /**
     * Identifica o destino da mensagem.
     * @return Sempre "DashboardServer".
     */
    @Override
    public String getDestinationNode() {
        return destinationNode;
    }
    
    @Override
    public String toString() {
        return String.format("StatsMessage[from=%s, to=%s, payload=%s]", 
            sourceNode, destinationNode, payload);
    }
}