package com.reucon.openfire.plugin.archive.model;

import org.jivesoftware.database.JiveID;
import org.xmpp.packet.JID;

import java.util.Date;

/**
 * An archived message.
 */
@JiveID(601)
public class ArchivedMessage {
	public enum Direction {
		/**
		 * A message sent by the owner.
		 */
		to,

		/**
		 * A message received by the owner.
		 */
		from
	}

	private Long id;
	private final Date time;
	private final Direction direction;
	private final String type;
	private String subject;
	private String body;
	private Conversation conversation;
	private JID withJid;
	private String stanza;

	public ArchivedMessage(Date time, Direction direction, String type, JID withJid) {
		this.time = time;
		this.direction = direction;
		this.type = type;
		this.withJid = withJid;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Date getTime() {
		return time;
	}

	public Direction getDirection() {
		return direction;
	}

	public String getType() {
		return type;
	}

	public String getSubject() {
		return subject;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public String getBody() {
		return body;
	}

	public void setBody(String body) {
		this.body = body;
	}

	public String getStanza() {
		return stanza;
	}

	public void setStanza(String stanza) {
		this.stanza = stanza;
	}

	public Conversation getConversation() {
		return conversation;
	}

	public void setConversation(Conversation conversation) {
		this.conversation = conversation;
	}

	/**
	 * Checks if this message contains payload that should be archived.
	 *
	 * @return <code>true</code> if this message is empty, <code>false</code>
	 *         otherwise.
	 */
	public boolean isEmpty() {
		return subject == null && body == null;
	}

	public JID getWithJid() {
		return withJid;
	}

	public String toString() {
		StringBuilder sb = new StringBuilder();

		sb.append("ArchivedMessage[id=").append(id).append(",");
		sb.append("time=").append(time).append(",");
		sb.append("direction=").append(direction).append("]");

		return sb.toString();
	}
}
