#ifndef PENDING_MSGS_H
#define PENDING_MSGS_H

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

/**
	Klasa ta reprezentuje kolejkę wiadomości oczekujących na odczytanie.
	Wiadomości takie mogą być przechowywane w tej klasie nawet pomiędzy kolejnymi
	uruchomieniami Kadu.
	\class PendingMsgs
	\brief Kolejka oczekujących wiadomości.
**/
class PendingMsgs : public QObject
{
	Q_OBJECT

	public:
		/**
			Struktura reprezentująca wiadomość oczekującą w kolejce.
			\struct Element
			\brief Wiadomość oczekującą w kolejce.
		**/
		struct Element
		{
			UserListElements users; /*!< Lista użytkowników, którzy nadesłali tę wiadomość. */
			QString proto; /*!< Nazwa protokołu. */
			QString msg; /*!< Treść wiadomości. */
			int msgclass; /*!< Klasa wiadomości. */
			time_t time; /*!< Czas, w którym nadano wiadomość. */
			Element();
		};

	private:
		typedef QValueList<Element> PendingMsgsList;
		PendingMsgsList msgs;

	public:
		/**
			\fn PendingMsgs(QObject *parent=0, const char *name=0)
			Standardowy konstruktor.
			\param parent rodzic kontrolki. Domyślnie 0.
			\param name nazwa kontrolki. Domyślnie 0.
		**/
		PendingMsgs(QObject *parent = 0, const char *name = 0);

		/**
			\fn bool pendingMsgs(UserListElement user) const
			Sprawdza, czy w kolejce są jakieś oczekujące wiadomości dla podanego użytkownika.
			\param user użytkownik, dla którego należy sprawdzić kolejkę.
			\return wartość logiczną informującą czy w kolejce jest jakaś wiadomość czy nie.
		**/
		bool pendingMsgs(UserListElement user) const;

		/**
			\fn bool pendingMsgs() const
			Sprawdza, czy w jakiejkolwiek kolejce są oczekujące wiadomości.
			\return wartość logiczną informującą czy są jakaś wiadomości czy nie.
		**/
		bool pendingMsgs() const;

		/**
			\fn int count() const
			Liczy wszystkie wiadomości oczekujące w kolejkach.
			\return liczba oczekujących wiadomości.
		**/
		int count() const;

		/**
			\fn Element &operator[](int index)
			\return wiadomość z kolejki, o podanym indeksie.
		**/
		Element &operator[](int index);

	public slots:
		/**
			\fn void openMessages()
			Wywołuje metodę ChatManager::openPendingMsgs.
		**/
		void openMessages();

		/**
			\fn void deleteMsg(int index)
			Usuwa z kolejki wiadomość o danym indeksie.
			\param index indeks wiadomości do usunięcia.
		**/
		void deleteMsg(int index);

		/**
			\fn void addMsg(QString protocolName, UserListElements users, QString msg, int msgclass, time_t time)
			Dodaje nową wiadomość do kolejki.
			\param protocolName nazwa protokołu
			\param users lista użytkowników, które przysłały wiadomość.
			\param msg treść wiadomości.
			\param msgclass klasa wiadomości.
			\param time czas nadesłania wiadomości.
		**/
		void addMsg(QString protocolName, UserListElements users, QString msg, int msgclass, time_t time);

		/**
			\fn bool loadFromFile()
			Wczytuje kolejkę wiadomości z pliku. Metoda ta wywoływana jest przy starcie
			Kadu.
		**/
		bool loadFromFile();

		/**
			\fn bool loadFromFile()
			Zapisuje kolejkę wiadomości do pliku. Metoda ta wywoływana jest przy zamykaniu
			Kadu.
		**/
		void writeToFile();

	signals:
		/**
			\fn void messageFromUserAdded(UserListElement user)
			Sygnał ten emitowany jest, gdy nowa wiadomość została dodana do kolejki.
		**/
		void messageFromUserAdded(UserListElement user);

		/**
			\fn void messageFromUserDeleted(UserListElement user)
			Sygnał ten emitowany jest, gdy wiadomość od użytkownika user została usunięta z kolejki.
		**/
		void messageFromUserDeleted(UserListElement user);
};

extern PendingMsgs pending;

#endif
