/*
 *
 * 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;

namespace Apache.Qpid.Messaging
{
   /// <summary>
   /// Defines an object capable of publishing messages
   /// to an AMQP broker. 
   /// </summary>
   /// <remarks>
   /// A publisher can be created using either 
   /// <see cref="IChannel.CreatePublisher"/> or 
   /// using the builder pattern (preferred) with 
   /// <see cref="IChannel.CreatePublisherBuilder"/>
   /// </remarks>
  public interface IMessagePublisher : IDisposable, ICloseable
   {
      /// <summary>
      /// Default delivery mode to use with this publisher
      /// </summary>
      DeliveryMode DeliveryMode { get; set; }
      /// <summary>
      /// Name of exchange messages are published to
      /// </summary>
      string ExchangeName { get; }
      /// <summary>
      /// Routing key used when publishing messages
      /// </summary>
      string RoutingKey { get; }
      /// <summary>
      /// If true, a message ID will not be generated by the publisher
      /// when sending the message
      /// </summary>
      bool DisableMessageID { get; set; }
      /// <summary>
      /// If true, no timestamp will be added to the message
      /// when publishing it
      /// </summary>
      bool DisableMessageTimestamp { get; set; }
      /// <summary>
      /// Default priority used when publishing messages
      /// </summary>
      int Priority { get; set; }
      /// <summary>
      /// Default time to live used when publishing messages
      /// </summary>
      long TimeToLive { get; set; }
      /// <summary>
      /// Set the default MIME type for messages produced by this producer. 
      /// This reduces the overhead of each message.
      /// </summary>
      string MimeType { get; set; }
      /// <summary>
      /// Set the default encoding for messages produced by this producer. 
      /// This reduces the overhead of each message.
      /// </summary>        
      string Encoding { get; set; }

      /// <summary>
      /// Publish a message, using any default values configured
      /// </summary>
      /// <param name="msg">Message to publish</param>
      void Send(IMessage msg);
      /// <summary>
      /// Publish a message with the specified options
      /// </summary>
      /// <param name="msg">Message to publish</param>
      /// <param name="deliveryMode">Delivery mode to use</param>
      /// <param name="priority">Priority of the message</param>
      /// <param name="timeToLive">Time to live of the message</param>
      void Send(IMessage msg, DeliveryMode deliveryMode, int priority, long timeToLive);
   }
}
