/*
 * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Copyright @ 2015 Atlassian Pty Ltd
 *
 * Licensed 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 net.java.sip.communicator.service.protocol.event;

import java.util.*;

import net.java.sip.communicator.service.protocol.*;

/**
 * <tt>MessageDeliveredEvent</tt>s confirm successful delivery of an instant
 * message.
 *
 * @author Emil Ivov
 */
public class MessageDeliveredEvent
    extends EventObject
{
    /**
     * Serial version UID.
     */
    private static final long serialVersionUID = 0L;

    /**
     * The contact that has sent this message.
     */
    private Contact to = null;

    /**
     * The <tt>ContactResource</tt>, to which the message was sent.
     */
    private ContactResource toResource = null;

    /**
     * A timestamp indicating the exact date when the event occurred.
     */
    private final Date timestamp;

    /**
     * The ID of the message being corrected, or null if this was a new message
     * and not a message correction.
     */
    private String correctedMessageUID;

    /**
     * Whether the delivered message is a sms message.
     */
    private boolean smsMessage = false;
    
    /**
     * Whether the delivered message is encrypted or not.
     */
    private boolean isMessageEncrypted = false;

     /**
      * Constructor.
      *
      * @param source message source
      * @param to the "to" contact
      */
     public MessageDeliveredEvent(Message source, Contact to)
     {
         this(source, to, new Date());
     }

     /**
      * Creates a <tt>MessageDeliveredEvent</tt> representing delivery of the
      * <tt>source</tt> message to the specified <tt>to</tt> contact.
      *
      * @param source the <tt>Message</tt> whose delivery this event represents.
      * @param to the <tt>Contact</tt> that this message was sent to.
      * @param correctedMessageUID The ID of the message being corrected.
      */
     public MessageDeliveredEvent(Message source, Contact to,
             String correctedMessageUID)
     {
         this(source, to, new Date());
         this.correctedMessageUID = correctedMessageUID;
     }

     /**
      * Creates a <tt>MessageDeliveredEvent</tt> representing delivery of the
      * <tt>source</tt> message to the specified <tt>to</tt> contact.
      *
      * @param source the <tt>Message</tt> whose delivery this event represents.
      * @param to the <tt>Contact</tt> that this message was sent to.
      * @param timestamp a date indicating the exact moment when the event
      * ocurred
      */
     public MessageDeliveredEvent(Message source, Contact to, Date timestamp)
     {
         super(source);

         this.to = to;
         this.timestamp = timestamp;
     }

     /**
      * Creates a <tt>MessageDeliveredEvent</tt> representing delivery of the
      * <tt>source</tt> message to the specified <tt>to</tt> contact.
      *
      * @param source the <tt>Message</tt> whose delivery this event represents.
      * @param to the <tt>Contact</tt> that this message was sent to.
      * @param timestamp a date indicating the exact moment when the event
      * ocurred
      */
     public MessageDeliveredEvent(
         Message source, Contact to, ContactResource toResource, Date timestamp)
     {
         super(source);

         this.to = to;
         this.toResource = toResource;
         this.timestamp = timestamp;
     }

     /**
      * Creates a <tt>MessageDeliveredEvent</tt> representing delivery of the
      * <tt>source</tt> message to the specified <tt>to</tt> contact.
      *
      * @param source the <tt>Message</tt> whose delivery this event represents.
      * @param to the <tt>Contact</tt> that this message was sent to.
      */
     public MessageDeliveredEvent(
         Message source, Contact to, ContactResource toResource)
     {
         this(source, to, new Date());

         this.toResource = toResource;
     }

     /**
      * Returns a reference to the <tt>Contact</tt> that <tt>Message</tt> was
      * sent to.
      *
      * @return a reference to the <tt>Contact</tt> that has send the
      * <tt>Message</tt> whose reception this event represents.
      */
     public Contact getDestinationContact()
     {
         return to;
     }

     /**
      * Returns the message that triggered this event
      * @return the <tt>Message</tt> that triggered this event.
      */
     public Message getSourceMessage()
     {
         return (Message) getSource();
     }


     /**
      * A timestamp indicating the exact date when the event occurred.
      * @return a Date indicating when the event occurred.
      */
     public Date getTimestamp()
     {
         return timestamp;
     }

    /**
     * Returns the ID of the message being corrected, or null if this was a
     * new message and not a message correction.
     *
     * @return the ID of the message being corrected, or null if this was a
     * new message and not a message correction.
     */
    public String getCorrectedMessageUID()
    {
        return correctedMessageUID;
    }

    /**
     * Sets the ID of the message being corrected to the passed ID.
     *
     * @param correctedMessageUID The ID of the message being corrected.
     */
    public void setCorrectedMessageUID(String correctedMessageUID)
    {
        this.correctedMessageUID = correctedMessageUID;
    }

    /**
     * Sets whether the message is a sms one.
     * @param smsMessage whether it is a sms one.
     */
    public void setSmsMessage(boolean smsMessage)
    {
        this.smsMessage = smsMessage;
    }

    /**
     * Returns whether the delivered message is a sms one.
     * @return whether the delivered message is a sms one.
     */
    public boolean isSmsMessage()
    {
        return smsMessage;
    }

    /**
     * Returns a reference to the <tt>ContactResource</tt> that has sent the
     * <tt>Message</tt> whose reception this event represents.
     *
     * @return a reference to the <tt>ContactResource</tt> that has sent the
     * <tt>Message</tt> whose reception this event represents.
     */
    public ContactResource getContactResource()
    {
        return toResource;
    }

    /**
     * Returns <tt>true</tt> if the message is encrypted and <tt>false</tt> if 
     * not.
     * @return <tt>true</tt> if the message is encrypted and <tt>false</tt> if 
     * not.
     */
    public boolean isMessageEncrypted()
    {
        return isMessageEncrypted;
    }

    /**
     * Sets the message encrypted flag of the event.
     * @param isMessageEncrypted the value to be set.
     */
    public void setMessageEncrypted(boolean isMessageEncrypted)
    {
        this.isMessageEncrypted = isMessageEncrypted;
    }
}
