#ifndef PENDING_MSGS_H
#define PENDING_MSGS_H

#include <qvaluelist.h>
#include "gadu.h"
#include "misc.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
		{
			UinsList uins; /*!< Lista numerów UIN, które nadesłały tę wiadomość. */
			QString msg; /*!< Treść wiadomości. */
			int msgclass; /*!< Klasa wiadomości. */
			time_t time; /*!< Czas, w którym nadano wiadomość. */
		};

	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(UinType uin) const
			Sprawdza, czy w kolejce są jakieś oczekujące wiadomości dla podanego numeru UIN.
			\param uin numer UIN dla którego należy sprawdzić kolejkę.
			\return wartość logiczną informującą czy w kolejce jest jakaś wiadomość czy nie.
		**/
		bool pendingMsgs(UinType uin) 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);

		/**
			void addMsg(UinsList uins, QString msg, int msgclass, time_t time)
			Dodaje nową wiadomość do kolejki.
			\param uins lista numerów UIN, 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(UinsList uins, 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 messageAdded()
			Sygnał ten emitowany jest, gdy nowa wiadomość została dodana do kolejki.
		**/
		void messageAdded();

		/**
			\fn void messageDeleted()
			Sygnał ten emitowany jest, gdy dowolna wiadomość została usunięta z kolejki.
		**/
		void messageDeleted();
};

extern PendingMsgs pending;

#endif
