/*
 * 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.
 */

using System;
using System.Collections;

using Apache.NMS.Util;

namespace Apache.NMS.Commands
{
    public class Message : IMessage, ICloneable
    {
        private IDestination destination;
        private string transactionId;
        private string messageId;
        private string groupID;
		private int groupSequence;
        private string correlationId;
        private bool persistent;
        private long expiration;
        private byte priority;
        private IDestination replyTo;
        private long timestamp;
        private string type;
        private bool redelivered;
        private byte[] content;
        private bool readOnlyMsgProperties;
        private bool readOnlyMsgBody;

        private MessagePropertyIntercepter propertyHelper;
        private PrimitiveMap properties;

        ///
        /// <summery>
        ///  Clone this object and return a new instance that the caller now owns.
        /// </summery>
        ///
        public virtual Object Clone()
        {
            // Since we are the lowest level base class, do a
            // shallow copy which will include the derived classes.
            // From here we would do deep cloning of other objects
            // if we had any.
            Message o = (Message) this.MemberwiseClone();

            if(this.messageId != null)
            {
                o.NMSMessageId = (string) this.messageId.Clone();
            }
			
			return o;
		}		

        ///
        /// <summery>
        ///  Returns a string containing the information for this DataStructure
        ///  such as its type and value of its elements.
        /// </summery>
        ///
        public override string ToString()
        {
            return GetType().Name + "[" +
                "Destination=" + destination + ", " +
                "TransactionId=" + transactionId + ", " +
                "MessageId=" + messageId + ", " +
                "GroupID=" + groupID + ", " +
                "GroupSequence=" + groupSequence + ", " +
                "CorrelationId=" + correlationId + ", " +
                "Expiration=" + expiration + ", " +
                "Priority=" + priority + ", " +
                "ReplyTo=" + replyTo + ", " +
                "Timestamp=" + timestamp + ", " +
                "Type=" + type + ", " +
                "Redelivered=" + redelivered +
                "]";
        }

        public void Acknowledge()
        {
        }
		
        public virtual void ClearBody()
        {
			this.content = null;
        }

        public virtual void ClearProperties()
        {
            this.properties.Clear();
        }
		
        protected void FailIfReadOnlyBody()
        {
            if(ReadOnlyBody == true)
            {
                throw new MessageNotWriteableException("Message is in Read-Only mode.");
            }
        }

        protected void FailIfWriteOnlyBody()
        {
            if(ReadOnlyBody == false)
            {
                throw new MessageNotReadableException("Message is in Write-Only mode.");
            }
        }
		
        #region Properties
		
		public string TransactionId
		{
			get { return this.transactionId; }
			set { this.transactionId = value; }
		}

        public byte[] Content
        {
            get { return content; }
            set { this.content = value; }
        }
		
        public virtual bool ReadOnlyProperties
        {
            get { return this.readOnlyMsgProperties; }
            set { this.readOnlyMsgProperties = value; }
        }

        public virtual bool ReadOnlyBody
        {
            get { return this.readOnlyMsgBody; }
            set { this.readOnlyMsgBody = value; }
        }
		
        public IPrimitiveMap Properties
        {
            get
            {
                if(null == properties)
                {
                    properties = new PrimitiveMap();
                    propertyHelper = new MessagePropertyIntercepter(this, properties, this.ReadOnlyProperties);
                    propertyHelper.AllowByteArrays = false;
                }

                return propertyHelper;
            }
        }

        /// <summary>
        /// The correlation ID used to correlate messages with conversations or long running business processes
        /// </summary>
        public string NMSCorrelationID
        {
            get { return correlationId; }
            set { correlationId = value; }
        }

        /// <summary>
        /// The destination of the message
        /// </summary>
        public IDestination NMSDestination
        {
            get { return destination; }
            set { this.destination = Destination.Transform(value); }
        }

        private TimeSpan timeToLive = TimeSpan.FromMilliseconds(0);
        /// <summary>
        /// The time in milliseconds that this message should expire in
        /// </summary>
        public TimeSpan NMSTimeToLive
        {
            get { return timeToLive; }

            set
            {
                timeToLive = value;
                if(timeToLive.TotalMilliseconds > 0)
                {
                    long timeStamp = timestamp;

                    if(timeStamp == 0)
                    {
                        timeStamp = DateUtils.ToJavaTimeUtc(DateTime.UtcNow);
                    }

                    expiration = timeStamp + (long) timeToLive.TotalMilliseconds;
                }
                else
                {
                    expiration = 0;
                }
            }
        }

        /// <summary>
        /// The timestamp the broker added to the message
        /// </summary>
        public DateTime NMSTimestamp
        {
            get { return DateUtils.ToDateTime(timestamp); }
            set
            {
                timestamp = DateUtils.ToJavaTimeUtc(value);
                if(timeToLive.TotalMilliseconds > 0)
                {
                    expiration = timestamp + (long) timeToLive.TotalMilliseconds;
                }
            }
        }

        /// <summary>
        /// The message ID which is set by the provider
        /// </summary>
        public string NMSMessageId
        {
            get { return this.messageId; }
            set { this.messageId = value; }
        }

        /// <summary>
        /// Whether or not this message is persistent
        /// </summary>
        public MsgDeliveryMode NMSDeliveryMode
        {
            get { return (persistent ? MsgDeliveryMode.Persistent : MsgDeliveryMode.NonPersistent); }
            set { persistent = (MsgDeliveryMode.Persistent == value); }
        }

        /// <summary>
        /// The Priority on this message
        /// </summary>
        public MsgPriority NMSPriority
        {
            get { return (MsgPriority) priority; }
            set { priority = (byte) value; }
        }

        /// <summary>
        /// Returns true if this message has been redelivered to this or another consumer before being acknowledged successfully.
        /// </summary>
        public bool NMSRedelivered
        {
            get { return this.redelivered; }
            set { this.redelivered = value; }
        }

        /// <summary>
        /// The destination that the consumer of this message should send replies to
        /// </summary>
        public IDestination NMSReplyTo
        {
            get { return replyTo; }
            set { replyTo = Destination.Transform(value); }
        }

        /// <summary>
        /// The type name of this message
        /// </summary>
        public string NMSType
        {
            get { return type; }
            set { type = value; }
        }

        #endregion

        #region NMS Extension headers

        /// <summary>
        /// Returns the number of times this message has been redelivered to other consumers without being acknowledged successfully.
        /// </summary>
        public int NMSXDeliveryCount
        {
            get { return 0; }
        }

        /// <summary>
        /// The Message Group ID used to group messages together to the same consumer for the same group ID value
        /// </summary>
        public string NMSXGroupID
        {
            get { return groupID; }
            set { groupID = value; }
        }
        /// <summary>
        /// The Message Group Sequence counter to indicate the position in a group
        /// </summary>
        public int NMSXGroupSeq
        {
            get { return groupSequence; }
            set { groupSequence = value; }
        }

        /// <summary>
        /// Returns the ID of the producers transaction
        /// </summary>
        public string NMSXProducerTXID
        {
            get
            {
                if(null != transactionId)
                {
                    return transactionId;
                }

                return String.Empty;
            }
        }

        #endregion

    };
}

