/*
 *
 * 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()
                                                                                                .getConsumerNumber());
        _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;
    }
}
