#ifndef KADU_USERLIST_H
#define KADU_USERLIST_H

#include <qstring.h>
#include "usergroup.h"

/**
	\class UserList
	\brief Klasa reprezentująca listę kontaktów.
**/
class UserList : public UserGroup
{
	Q_OBJECT
	public:
		/**
			\fn static void initModule()
			Inicjuje moduł listy kontaktów.
		**/
		static void initModule();

		/**
			\fn static void closeModule()
			Sprząta po module listy kontaktów.
		**/
		static void closeModule();

	public slots:
		/**
			\fn bool readFromFile()
			Wczytuje listę kontaktów z plików "userlist"
			i "userattribs" z katalogu z ustawieniami.
			TODO: obsolete, do wywalenia w 0.6
			\return FALSE, gdy wystąpiły błędy, lub TRUE w przeciwnym wypadku.
		**/
		bool readFromFile();

		/**
			\fn void merge(const QValueList<UserListElement> &list)
			Scala listę kontaktów z podaną listą kontaktów \a userlist.
			\param userlist lista kontaktów z którą należy scalić
		**/
		void merge(const QValueList<UserListElement> &list);

		/**
			\fn void readFromConfig()
			Wczytuje listę kontaktów z drzewa xml z konfiguracją
			programu. Poprzednie kontakty są usuwane.
		**/
		void readFromConfig();

		/**
			\fn void writeToConfig()
			Dodaje listę kontaktów do drzewa xml z konfiguracją
			programu. Poprzednie kontakty są usuwane.
		**/
		void writeToConfig();

		/**
			\fn void setAllOffline(const QString &protocolName)
			\param protocolName identyfikator protokołu
			Przestawia status wszystkich kontaktów
			dla wskazanego protokołu na "niedostępny".

		**/
		void setAllOffline(const QString &protocolName);

		/**
			\fn void clear()
			Usuwa wszystkie kontakty.
		**/
		void clear();

		void addPerContactNonProtocolConfigEntry(const QString &attribute_name, const QString &internal_key);
		void removePerContactNonProtocolConfigEntry(const QString &attribute_name);
		void addPerContactProtocolConfigEntry(const QString &protocolName, const QString &attribute_name, const QString &internal_key);
		void removePerContactProtocolConfigEntry(const QString &protocolName, const QString &attribute_name);


	private:
		/**
			\fn UserList()
			Konstruktor standardowy.
		**/
		UserList();

		/**
			\fn ~UserList()
		**/
		virtual ~UserList();

		QMap<QString, QString> nonProtoKeys;
		QMap<QString, QMap<QString, QString> > protoKeys;

		void initKeys();
};

extern UserList *userlist;

#endif
