/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */
package org.apache.qpid.server.message;

import java.util.Collections;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;

public class MessageInfoImpl implements MessageInfo
{
    private final String _deliveredTo;
    private final Date _arrivalTime;
    private final boolean _persistent;
    private final String _messageId;
    private final Date _expirationTime;
    private final String _applicationId;
    private final String _correlationId;
    private final String _encoding;
    private final String _mimeType;
    private final byte _priority;
    private final String _replyTo;
    private final Date _timestamp;
    private final String _type;
    private final String _userId;
    private final String _state;
    private final int _deliveryCount;
    private final long _size;
    private final long _id;
    private final Map<String, Object> _headers;
    private final String _initialRoutingAddress;
    private final Date _notValidBefore;

    public MessageInfoImpl(final MessageInstance instance, final boolean includeHeaders)
    {
        final ServerMessage message = instance.getMessage();
        final AMQMessageHeader messageHeader = message.getMessageHeader();

        _deliveredTo = instance.getDeliveredConsumer() == null ? null : String.valueOf(instance.getDeliveredConsumer()
                                                                                                .getIdentifier());
        _arrivalTime = message.getArrivalTime() == 0L ? null : new Date(message.getArrivalTime());
        _persistent = message.isPersistent();
        _messageId = messageHeader.getMessageId();
        _expirationTime = messageHeader.getExpiration() == 0L ? null : new Date(messageHeader.getExpiration());
        _applicationId = messageHeader.getAppId();
        _correlationId = messageHeader.getCorrelationId();
        _encoding = messageHeader.getEncoding();
        _mimeType = messageHeader.getMimeType();
        _priority = messageHeader.getPriority();
        _replyTo = messageHeader.getReplyTo();
        _timestamp = messageHeader.getTimestamp() == 0L ? null : new Date(messageHeader.getTimestamp());
        _type = messageHeader.getType();
        _userId = messageHeader.getUserId();
        if (instance.isAvailable())
        {
            _state = instance.isHeld() ? "Held" : "Available";
        }
        else
        {
            _state = instance.isAcquired() ? "Acquired" : "";
        }
        _deliveryCount = instance.getDeliveryCount();
        _size = message.getSize();
        _id = message.getMessageNumber();
        _initialRoutingAddress = message.getInitialRoutingAddress();
        _notValidBefore = messageHeader.getNotValidBefore() == 0L ? null : new Date(messageHeader.getNotValidBefore());

        if(includeHeaders)
        {
            Map<String,Object> headers = new LinkedHashMap<>();
            for(String headerName : messageHeader.getHeaderNames())
            {
                headers.put(headerName, messageHeader.getHeader(headerName));
            }
            _headers = Collections.unmodifiableMap(headers);
        }
        else
        {
            _headers = null;
        }
    }


    @Override
    public long getId()
    {
        return _id;
    }

    @Override
    public long getSize()
    {
        return _size;
    }

    @Override
    public int getDeliveryCount()
    {
        return _deliveryCount;
    }

    @Override
    public String getState()
    {
        return _state;
    }

    @Override
    public String getDeliveredTo()
    {
        return _deliveredTo;
    }

    @Override
    public Date getArrivalTime()
    {
        return _arrivalTime == null ? null : new Date(_arrivalTime.getTime());
    }

    @Override
    public boolean isPersistent()
    {
        return _persistent;
    }

    @Override
    public String getMessageId()
    {
        return _messageId;
    }

    @Override
    public Date getExpirationTime()
    {
        return _expirationTime == null ? null : new Date(_expirationTime.getTime());
    }

    @Override
    public String getApplicationId()
    {
        return _applicationId;
    }

    @Override
    public String getCorrelationId()
    {
        return _correlationId;
    }

    @Override
    public String getEncoding()
    {
        return _encoding;
    }

    @Override
    public String getMimeType()
    {
        return _mimeType;
    }

    @Override
    public int getPriority()
    {
        return _priority;
    }

    @Override
    public String getReplyTo()
    {
        return _replyTo;
    }

    @Override
    public Date getTimestamp()
    {
        return _timestamp == null ? null : new Date(_timestamp.getTime());
    }

    @Override
    public String getType()
    {
        return _type;
    }

    @Override
    public String getUserId()
    {
        return _userId;
    }

    @Override
    public Map<String, Object> getHeaders()
    {
        return _headers;
    }

    @Override
    public Date getNotValidBefore()
    {
        return _notValidBefore == null ? null : new Date(_notValidBefore.getTime());
    }

    public String getInitialRoutingAddress()
    {
        return _initialRoutingAddress;
    }
}
