/*
    msncontact.h - MSN Contact

    Copyright (c) 2002      by Duncan Mac-Vicar Prett <duncan@kde.org>
    Copyright (c) 2002      by Ryan Cumming           <bodnar42@phalynx.dhs.org>
    Copyright (c) 2002      by Martijn Klingens       <klingens@kde.org>
    Copyright (c) 2002-2005 by Olivier Goffart        <ogoffart at kde.org>
    Copyright (c) 2005      by Michaël Larouche       <michael.larouche@kdemail.net>

    Kopete    (c) 2002-2005 by the Kopete developers  <kopete-devel@kde.org>


    *************************************************************************
    *                                                                       *
    * This program is free software; you can redistribute it and/or modify  *
    * it under the terms of the GNU General Public License as published by  *
    * the Free Software Foundation; either version 2 of the License, or     *
    * (at your option) any later version.                                   *
    *                                                                       *
    *************************************************************************
*/

#ifndef MSNCONTACT_H
#define MSNCONTACT_H

#include "kopetecontact.h"
#include "kopeteonlinestatus.h"

#include <kurl.h>

class TQListView;
class TQListViewItem;
class TQPixmap;
class TQTimer;

class MSNChatSession;
class TDEAction;
class TDEActionCollection;
class KTempFile;

namespace Kopete { class Protocol; }
namespace Kopete { class OnlineStatus; }

class MSNContact : public Kopete::Contact
{
	TQ_OBJECT
  

public:
	MSNContact( Kopete::Account *account, const TQString &id, Kopete::MetaContact *parent );
	~MSNContact();

	/**
	 * Indicate whether this contact is blocked
	 */
	bool isBlocked() const;
	void setBlocked( bool b );

	/**
	 * Indicate whether this contact is deleted
	 *   (not on the serverside list)
	 */
	bool isDeleted() const;
	void setDeleted( bool d );

	/**
	 * Indicate whether this contact is allowed
	 */
	bool isAllowed() const;
	void setAllowed( bool d );

	/**
	 * Indicate whether this contact is on the reversed list
	 */
	bool isReversed() const;
	void setReversed( bool d );
	
	/**
	 * set one phone number
	 */
	void setInfo(const TQString &type, const TQString &data);

	/**
	 * The groups in which the user is located on the server.
	 */
	const TQMap<TQString, Kopete::Group *>  serverGroups() const;
	/**
	 * clear that map
	 */
	void clearServerGroups();
	
	/**
	 * client flags  (say what version of msn messenger the contact is using)
	 */
	uint clientFlags() const;
	void setClientFlags( uint );

	virtual bool isReachable();

	virtual TQPtrList<TDEAction> *customContextMenuActions();

	/**
	 * update the server group map
	 */
	void contactRemovedFromGroup( const TQString& groupId );
	void contactAddedToGroup(const TQString& groupId, Kopete::Group *group );

	virtual void serialize( TQMap<TQString, TQString> &serializedData, TQMap<TQString, TQString> &addressBookData );

	/**
	 * Rename contact on server
	 */
	virtual void rename( const TQString &newName ) KDE_DEPRECATED;

	/**
	 * Returns the MSN Message Manager associated with this contact
	 */
	virtual Kopete::ChatSession *manager( Kopete::Contact::CanCreateFlags = Kopete::Contact::CannotCreate );


	/**
	 * Because blocked contact have a small auto-modified status
	 */
	void setOnlineStatus(const Kopete::OnlineStatus&);

	TQString guid();
	TQString phoneHome();
	TQString phoneWork();
	TQString phoneMobile();

	void setObject(const TQString &obj);
	TQString object() const { return m_obj; }

public slots:
	virtual void slotUserInfo();
	virtual void deleteContact();
	virtual void sendFile( const KURL &sourceURL = KURL(),
						   const TQString &fileName = TQString(), uint fileSize = 0L );

	/**
	 * Every time the kopete's contactlist is modified, we sync the serverlist with it
	 */
	virtual void sync( unsigned int cvhanged= 0xff);


	void setDisplayPicture(KTempFile *f) ;

signals:
	void displayPictureChanged();

private slots:
	void slotBlockUser();
	void slotShowProfile();
	void slotSendMail();
	void slotEmitDisplayPictureChanged();

	/**
	 * Workaround to make this checkboxe readonly
	 */
	void slotUserInfoDialogReversedToggled();

private:
	TQMap<TQString, Kopete::Group *> m_serverGroups;

	bool m_blocked;
	bool m_allowed;
	bool m_deleted;
	bool m_reversed;
	bool m_moving;
	bool m_phone_mob;
	
	uint m_clientFlags;

	TQString m_phoneHome;
	TQString m_phoneWork;
	TQString m_phoneMobile;


	TDEAction *actionBlock;
	TDEAction *actionShowProfile;
	TDEAction *actionSendMail;
	TDEAction *actionWebcamReceive;
	TDEAction *actionWebcamSend;

	TQString m_obj; //the MSNObject

	/**
	 * keep the current status here.  (it's normally already in Kopete::Contact::d->onlineStatus)
	 * This is a workaround to prevent problems with the account offline status.
	 */
	Kopete::OnlineStatus m_currentStatus;

	//MSNProtocol::deserializeContact need to acess some contact insternals
	friend class MSNProtocol;
};

#endif
