#ifndef _KVI_REGUSERSDB_H_
#define _KVI_REGUSERSDB_H_
//=================================================================================================
//
//   File : KviRegisteredUserDataBase.h
//   Creation date : Sat Sep 09 2000 15:30:56 by Szymon Stefanek
//
//   This file is part of the KVIrc irc client distribution
//   Copyright (C) 2000-2010 Szymon Stefanek (pragma at kvirc dot net)
//
//   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 opinion) any later version.
//
//   This program is distributed in the HOPE that it will be USEFUL,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//   See the GNU General Public License for more details.
//
//   You should have received a copy of the GNU General Public License
//   along with this program. If not, write to the Free Software Foundation,
//   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=================================================================================================

//
// REGISTERED USERS
//
//     Here we manage users resigered by mask and their (generic!) properties
//

#include "kvi_settings.h"
#include "kvi_debug.h"

#include "KviHeapObject.h"
#include "KviPointerHashTable.h"
#include "KviRegisteredUserGroup.h"
#include "KviRegisteredUserMask.h"

#include <QObject>


//=================================================================================================
//
// KviRegisteredUserDataBase
//
//    Manages a set of KviRegisteredUser instances stored in the m_pUserDict dictionary
//    The users are identified by masks stored in m_pMaskDict and m_pWildMaskList
//    m_pMaskDict contains lists of non wild-nick KviRegisteredUserMask that point to users
//    m_pWildMaskList is a list of wild-nick KviRegisteredUserMask that point to users
//

class KVILIB_API KviRegisteredUserDataBase : public QObject
{
	Q_OBJECT
public:
	KviRegisteredUserDataBase();
	~KviRegisteredUserDataBase();
private:
	KviPointerHashTable<QString,KviRegisteredUser>     * m_pUserDict; // unique namespace, owns the objects, does not copy keys
	KviPointerHashTable<QString,KviRegisteredUserMaskList> * m_pMaskDict; // owns the objects, copies the keys
	KviRegisteredUserMaskList          * m_pWildMaskList; // owns the objects
	KviPointerHashTable<QString,KviRegisteredUserGroup>* m_pGroupDict;
public:
	void copyFrom(KviRegisteredUserDataBase * db);
	KviRegisteredUser * addUser(const QString &name); // returns 0 if already there
	KviRegisteredUser * getUser(const QString &name); // returns existing or adds
	bool removeUser(const QString &name);
	bool removeGroup(const QString &name);
	KviRegisteredUser * findUserByName(const QString &name){ return m_pUserDict->find(name); };
	// mask must be allocated on the heap and the ownership is transferred!
	// returns non zero if there is already an user with this mask (returns the pointer to it!)
	KviRegisteredUser * addMask(KviRegisteredUser * u,KviIrcMask * mask);
	bool removeMaskByPointer(KviIrcMask * mask);
	bool removeMask(const KviIrcMask &mask);
	KviRegisteredUser * findMatchingUser(const QString &nick,const QString &user,const QString &host);
	KviRegisteredUser * findUserWithMask(const KviIrcMask &mask);
	KviRegisteredUserMask * findExactMask(const KviIrcMask &mask);
	KviRegisteredUserMask * findMatchingMask(const QString &nick,const QString &user,const QString &host);
	//Only used in few places (actually one) of the code, but lot of times;perfect for inlining...
	//bool isIgnoredUser(const char * nick,const char * user,const char * host);
	void load(const QString &filename);
	void save(const QString &filename);

	KviPointerHashTable<QString,KviRegisteredUser> * userDict(){ return m_pUserDict; };
	KviPointerHashTable<QString,KviRegisteredUserGroup>* groupDict() { return m_pGroupDict; };

	KviRegisteredUserGroup* addGroup(const QString &name);
signals:
	void userRemoved(const QString&);
	void userChanged(const QString&);
	void userAdded  (const QString&);
	void databaseCleared();
};

#ifndef _KVI_REGUSERDB_CPP_
	extern KVILIB_API KviRegisteredUserDataBase * g_pRegisteredUserDataBase;
#endif // _KVI_REGUSERDB_CPP_

#endif //_KVI_REGUSERSDB_H_
