/**
 * 
 */
package com.beem.project.beem.service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.jivesoftware.smack.RosterGroup;
import org.jivesoftware.smack.packet.Presence;

import android.os.Parcel;
import android.os.Parcelable;

import com.beem.project.beem.utils.Status;

/**
 * This class contains informations on a jabber contact.
 * 
 * @author darisk
 */
public class Contact implements Parcelable {

    @SuppressWarnings("unused")
    private static final String                     TAG     = "Contact";

    private int                                     mID;
    private int                                     mStatus;
    private String                                  mJID;
    private String                                  mName;
    private String                                  mMsgState;
    private List<String>                            mRes;
    private List<String>                            mGroups;

    /**
     * Parcelable.Creator needs by Android.
     */
    public static final Parcelable.Creator<Contact> CREATOR = new Parcelable.Creator<Contact>() {

	                                                        @Override
	                                                        public Contact createFromParcel(Parcel source) {
		                                                    return new Contact(source);
	                                                        }

	                                                        @Override
	                                                        public Contact[] newArray(int size) {
		                                                    return new Contact[size];
	                                                        }
	                                                    };

    /**
     * Constructor.
     */
    public Contact() {
	// TODO Auto-generated constructor stub
    }

    /**
     * Construct a contact from a parcel.
     * 
     * @param in
     *            parcel to use for construction
     */
    private Contact(final Parcel in) {
	mID = in.readInt();
	mStatus = in.readInt();
	mJID = in.readString();
	mName = in.readString();
	mMsgState = in.readString();
	mRes = new ArrayList<String>();
	mGroups = new ArrayList<String>();
	in.readStringList(mRes);
	in.readStringList(mGroups);
    }

    /**
     * Constructor.
     * 
     * @param jid
     *            JID of the contact
     */
    public Contact(final String jid) {
	mJID = jid;
	mName = jid;
	mStatus = Status.CONTACT_STATUS_DISCONNECT;
	mRes = new ArrayList<String>();
	mRes.add("none");
	mGroups = new ArrayList<String>();
    }

    public void addGroup(String group) {
	mGroups.add(group);
    }

    /**
     * @param res
     */
    public void addRes(String res) {
	if (!mRes.contains(res))
	    mRes.add(res);
    }

    /**
     * @param res
     */
    public void delRes(String res) {
	mRes.remove(res);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int describeContents() {
	// TODO Auto-generated method stub
	return 0;
    }

    /**
     * @return the mGroups
     */
    public List<String> getGroups() {
	return mGroups;
    }

    /**
     * Get the id of the contact on the phone contact list.
     * 
     * @return the mID
     */
    public int getID() {
	return mID;
    }

    /**
     * Get the Jabber ID of the contact.
     * 
     * @return the Jabber ID
     */
    public String getJID() {
	return mJID;
    }

    /**
     * @return the mRes
     */
    public List<String> getMRes() {
	return mRes;
    }

    /**
     * Get the message status of the contact.
     * 
     * @return the message status of the contact.
     */
    public String getMsgState() {
	return mMsgState;
    }

    /**
     * @return the mName
     */
    public String getName() {
	return mName;
    }

    /**
     * Get the status of the contact.
     * 
     * @return the mStatus
     */
    public int getStatus() {
	return mStatus;
    }

    public void setGroups(Collection<RosterGroup> groups) {
	for (RosterGroup rosterGroup : groups) {
	    mGroups.add(rosterGroup.getName());
	}
    }

    /**
     * @param mGroups
     *            the mGroups to set
     */
    public void setGroups(List<String> mGroups) {
	this.mGroups = mGroups;
    }

    /**
     * set the id of te contact on the phone contact list.
     * 
     * @param mid
     *            the mID to set
     */
    public void setID(int mid) {
	mID = mid;
    }

    /**
     * Set the Jabber ID of the contact.
     * 
     * @param mjid
     *            the jabber ID to set
     */
    public void setJID(String mjid) {
	mJID = mjid;
    }

    /**
     * @param mRes
     *            the mRes to set
     */
    public void setMRes(List<String> mRes) {
	this.mRes = mRes;
    }

    /**
     * Set the message status of the contact.
     * 
     * @param msgState
     *            the message status of the contact to set
     */
    public void setMsgState(String msgState) {
	mMsgState = msgState;
    }

    /**
     * @param mName
     *            the mName to set
     */
    public void setName(String mName) {
	if (mName != null)
	    this.mName = mName;
    }

    /**
     * Set the status of the contact.
     * 
     * @param status
     *            the mStatus to set
     */
    public void setStatus(int status) {
	mStatus = status;
    }

    /**
     * Set the status of the contact using a presence packet.
     * 
     * @param presence
     *            the presence containing status
     */
    public void setStatus(Presence presence) {
	mStatus = Status.getStatusFromPresence(presence);
	mMsgState = presence.getStatus();
    }

    public void setStatus(PresenceAdapter presence) {
	mStatus = presence.getStatus();
	mMsgState = presence.getStatusText();

    }

    @Override
    public String toString() {
	if (mJID != null)
	    return mJID;
	return super.toString();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
	dest.writeInt(mID);
	dest.writeInt(mStatus);
	dest.writeString(mJID);
	dest.writeString(mName);
	dest.writeString(mMsgState);
	dest.writeStringList(getMRes());
	dest.writeStringList(getGroups());
    }
}
