package com.beem.project.beem.service;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.XMPPException;

import android.os.RemoteException;

import com.beem.project.beem.service.aidl.IChat;

/**
 * An adapter for smack's Chat class.
 * 
 * @author darisk
 */
public class ChatAdapter extends IChat.Stub {
	private static final int HISTORY_MAX_SIZE = 50;

	private final Chat mAdaptee;
	private final Contact mParticipant;
	private String mState;
	private boolean mIsOpen;
	private final List<Message> mMessages;

	/**
	 * Constructor.
	 * 
	 * @param chat
	 *            The chat to adapt
	 */
	public ChatAdapter(final Chat chat) {
		mAdaptee = chat;
		mParticipant = new Contact(chat.getParticipant());
		mMessages = new LinkedList<Message>();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public Contact getParticipant() throws RemoteException {
		return mParticipant;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void sendMessage(com.beem.project.beem.service.Message message) throws RemoteException {
		org.jivesoftware.smack.packet.Message send = new org.jivesoftware.smack.packet.Message();
		send.setTo(message.getTo());
		send.setBody(message.getBody());
		send.setThread(message.getThread());
		send.setSubject(message.getSubject());
		send.setType(org.jivesoftware.smack.packet.Message.Type.chat);
		// TODO gerer les messages contenant des XMPPError
		// send.set
		try {
			mAdaptee.sendMessage(send);
			mMessages.add(message);
		} catch (XMPPException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String getState() throws RemoteException {
		return mState;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void setState(String state) throws RemoteException {
		mState = state;
	}

	/**
	 * Get the adaptee for the Chat.
	 * 
	 * @return The real chat object
	 */
	public Chat getAdaptee() {
		return mAdaptee;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void setOpen(boolean isOpen) {
		this.mIsOpen = isOpen;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public boolean isOpen() {
		return mIsOpen;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public List<Message> getMessages() throws RemoteException {
		return Collections.unmodifiableList(mMessages);
	}

	/**
	 * Add a message in the chat history.
	 * 
	 * @param msg
	 *            the message to add
	 */
	void addMessage(Message msg) {
		if (mMessages.size() == HISTORY_MAX_SIZE)
			mMessages.remove(0);
		mMessages.add(msg);
	}

}
