
#ifndef PENDING_EVENTS_H
#define PENDING_EVENTS_H

#include <qptrlist.h>
#include "gadu.h"
#include "misc.h"

/**
	Klasa bazowa dla wszystkich kolejkowanych zdarzeń.
	\class PendingEvent
	\brief Zdarzenia kolejkowane.
**/
class PendingEvent
{
	public:
		/**
			\fn virtual bool sendBy(UinType uin)
			Sprawdza czy zdarzenie dotyczy podanego numeru UIN.
			\param uin numer UIN o który pytamy.
			\return wartość logiczna informująca czy zdarzenie dotyczy tego numeru UIN czy nie.
		**/
		virtual bool sendBy(UinType uin)=0;

		/**
			\fn virtual void activate()
			Czyni zdarzenie aktywnym.
		**/
		virtual void activate()=0;
};

/**
	\class PendingMessage
	\brief Wiadomość kolejkowana.
**/
class PendingMessage : public PendingEvent
{
	private:
		UinsList Uins;
		QString Msg;
		int MsgClass;
		time_t Time;
		
	public:
		/**
			\fn PendingMessage(const UinsList uins,const QString& msg, const int msg_class,const time_t time)
			Konstruktor tworzący wiadomość kolejkowaną wg. podanych danych.
			\param uins lista numerów UIN od których otrzymano tą wiadomość.
			\param msg treść wiadomości.
			\param msg_class klasa wiadomości.
			\param time czas wysłania wiadomości.
		**/
		PendingMessage(const UinsList uins,const QString& msg,
			const int msg_class,const time_t time);
		virtual ~PendingMessage();

		/**
			\fn virtual bool sendBy(UinType uin)
			Sprawdza czy zdarzenie dotyczy podanego numeru uin.
			Jest to prawda jesli podany uin jest jednym z
			nadawcow wiadomosci.
			\param uin numer UIN o który pytamy.
			\return wartość logiczna informująca czy zdarzenie dotyczy tego numeru UIN czy nie.
		**/
		virtual bool sendBy(UinType uin);

		/**
			\fn virtual void activate()
			Aktywuje zdarzenie. Wyświetla wiadomość w oknie Chat.
		**/
		virtual void activate();
};

/**
	Klasa bazowa dla wszystkich kolejek zdarzeń.
	\class PendingEvents
	\brief Kolejki zdarzeń.
**/
class PendingEvents : public QObject
{
	Q_OBJECT

	private:
		typedef QPtrList<PendingEvent> PendingEventsList;
		PendingEventsList Events;
		
	public:
		/**
			\fn PendingEvents()
			Standardowy konstruktor.
		**/
		PendingEvents();

		/**
			\fn void queueEvent(PendingEvent* event)
			Kolejkuje zdarzenie.
			\param event wskaźnik do obiektu,
				który jest usuwany przez PendingEvents
				podczas aktywacji zdarzenia.
		**/
		void queueEvent(PendingEvent* event);

		/**
			\fn void activateEvent(int index)
			Aktywuje zakolejkowane zdarzenie o podanym indeksie
			i usuwa je z kolejki.
			\param index indeks zdarzenia, które ma być aktywowane i usunięte.
		**/
		void activateEvent(int index);

		/**
			\fn void activateEvent()
			Aktywuje i usuwa z kolejki pierwsze zakolejkowane
			zdarzenie.
		**/
		void activateEvent();

		/**
			\fn PendingEvent* operator[](int index)
			\param index index zakolejkowanego zdarzenia.
			\return zakolejkowane zdarzenie o podanym indeksie.
		**/
		PendingEvent* operator[](int index);

		/**
			\fn bool pendingEvents(UinType uin)
			Sprawdza czy istnieją zakolejkowane zdarzenia
			dotyczące podanego numeru uin.
			\param uin numer UIN o który pytamy.
			\return wartość logiczna informująca czy istnieją zakolejkowane zdarzenia.
		**/
		bool pendingEvents(UinType uin);

		/**
			\fn bool pendingEvents()
			Sprawdza czy istnieja jakiekolwiek zakolejkowane zdarzenia.
			\return wartość logiczna informująca czy istnieją zakolejkowane zdarzenia.
		**/
		bool pendingEvents();
//		bool loadFromFile();
//		void writeToFile();

	signals:
		/**
			\fn void eventQueued(PendingEvent* event)
			Sygnal emitowany po zakolejkowaniu zdarzenia.
			\param event wskaźnik do obiektu opisującego zdarzenie.
		**/
		void eventQueued(PendingEvent* event);

		/**
			\fn void eventActivated(PendingEvent* event)
			Sygnal emitowany po aktywacji zdarzenia i usunięciu
			go z kolejki. Po obsłużeniu sygnału obiekt jest
			usuwany.
			\param event wskaźnik do obiektu opisującego zdarzenie.
		**/
		void eventActivated(PendingEvent* event);
};

extern PendingEvents pending_events;

#endif
