#ifndef XMPP_CONTACT_LIST_H
#define XMPP_CONTACT_LIST_H

#include <apps.h>
#include <list_ctrl.h>
#include <solib.h>

#include "xml_parser.h"


#define MSG_COUNT	16

enum {
	SUB_NONE,
	SUB_TO,
	SUB_FROM,
	SUB_BOTH
};

enum
{
	CONTACT_DEF,		// Обычный контакт
	CONTACT_GROUP,		// Группа
	CONTACT_MUC,		// Конференция
	CONTACT_TRANSPORT	// Транстпорт
	
};

typedef enum {
	AFFILIATION_NONE,
	AFFILIATION_OUTCAST,
	AFFILIATION_MEMBER,
	AFFILIATION_ADMIN,
	AFFILIATION_OWNER
	
}JABBER_GC_AFFILIATION;

typedef enum {
	ROLE_NONE,
	ROLE_VISITOR,
	ROLE_PARTICIPANT,
	ROLE_MODERATOR
}JABBER_GC_ROLE;

typedef struct
{
	JABBER_GC_AFFILIATION 	aff;
	JABBER_GC_ROLE 			role;
	char 					*real_jid;
	
}CONF_DATA;

enum {
	MSG_TYPE_IN,	// Входящее
	MSG_TYPE_OUT,	// Исходящее
	MSG_TYPE_SYSTEM,// Системное
	MSG_TYPE_URL	// Ссылка

};
typedef struct {
    CLK_DATE_T  date;	// Дата
    CLK_TIME_T  time;	// Время
    UINT8       type;	// Тип соощения (входящее/исходящее/системное)
	UINT32		len;	// Длина текста сообщения
    char        *text;	// Текст сообщения
} MSG_T;

typedef struct
{
	char		*nick;			// Псевдоним
	char		*vcard_nick;	// Псевдоним который указан в vCard
	char		*jid;			// JID
	UINT8		group_id; 		// Группа контакта
	UINT8		status;			// Статус контакта
	UINT8		xstatus;		// X-Статус контакта
	char		*status_msg;	// Статусное сообщение
	char		*xstatus_msg;	// X-Статусное сообщение
	char		*resource;		// Ресурс
	//char		*time
	UINT8		priority;		// Приоритет контакта
	UINT8		subscription; 	// Подписка
	BOOL 		new_msg;		// Флаг нового сообщения
	UINT8		client_id;		// Клиент контакта
	BOOL		chat;			// Флаг контакта с чатом
	char		*password;		// Пароль конференции
	UINT8		message_num;
	UINT8		type;			// Тип контакта
	BOOL 		composing;		// Сообшение о наборе
	CONF_DATA 	muc_privs;      // Тут для конференционных контактов - про роли и риал-жид
	LIST		history;		// История сообщений
	
} CONTACT_T; // Память для контакта.

void ContactListInit( void );
void ContactListUninit( void );

int ContactListFillRoster( XMLNode* items );	// Преобразование XML-данных в ростер

int ContactListAddContact(char* jid, char* nick, UINT8 subscription, UINT8 group_id);	// Добавить к листу контакт
int ContactListDeleteContact(const char* jid);	// Удалить контакт

int ContactListChangeParams(char* jid, char* nick, UINT8 subscription, UINT8 group_id);	// Изменить данные контакта
int ContactListChangeStatus(char *jid, UINT8 status);									// Изменить статус пользователя 
int ContactListChangeComposingStatus(char *jid, BOOL composing);						// Сообшение о наборе

void ContactListInitGroupsList(void);		// Инициализация списка
void ContactListKillGroupsList(void);		// Уничтожить список групп. Необходимо вызвать в конце работы

int ContactListAddGroup(char *gr_name);		// Добавляем группу в список. Возвращает номер созданной группы начиная с 1
int ContactListGetGroupID(char *gr_name);	// Возвращает ID группы с именем gr_name или -1, если такой нет

SO_PUBLIC char* ContactListGetGroupNameByID(int gr_id);	// Возвращает имя группы с ID = gr_id или NULL, если такой нет
SO_PUBLIC int ContactListGetGroupCount(void);			// Возвращает количество групп

SO_PUBLIC int ContactListUpdate( UINT32 params, UINT8 curren_group );
SO_PUBLIC int ContactListShort( void );
SO_PUBLIC int ContactListGetNum(void);							// Возвращает общее число контактов 
SO_PUBLIC CONTACT_T* ContactListGetContact( int index );		// Поиск контакта в экранном списке
SO_PUBLIC CONTACT_T* ContactListFindContact( const char *jid );	// Поиск jid'a в контакт листе 

SO_PUBLIC int ContactListGetContactCount(int group_id);			// Возвращает число контактов в указанной группе
SO_PUBLIC int ContactListGetOnlineContactCount(int group_id);	// Возвращает число онлайн контактов в указанной группе
SO_PUBLIC int ContactListGetIncomingMsgCount(void);				// Возвращает число непрочитанных сообщений
SO_PUBLIC int ContactListGetChatCount(void);					// Возвращает число контактов с чатом
SO_PUBLIC int ContactListGetNumberOfOnlineUsers(void);			// Возвращает число онлайн контактов

SO_PUBLIC int ContactListMsgAdd( CONTACT_T * c, MSG_T * msg );
SO_PUBLIC int ContactListMsgFreeQueue( CONTACT_T * c );
SO_PUBLIC int ContactListMsgGetNum( CONTACT_T * c );
SO_PUBLIC MSG_T * ContactListMsgGet( CONTACT_T * c, UINT16 i );

int ContactListAddSystemMessage(char* jid, char status, char* status_msg);

char*  UtilGetJIDByFullJID(char * full_jid, char jid[]);	// login@jabber.ru/resourse > login@jabber.ru
char*  UtilGetResourceByFullJID(char* full_jid);			// login@jabber.ru/resourse > resourse
int    UtilGetPresenceIndex(char* presence_str); 			// Возвращает внутренний номер данного типа присутствия по строке с присутсвием
int	   UtilGetAffRoleIndex(char* str);						// Возвращает внутренний номер данного типа роли/полномочий по строке с присутсвием
char*  UtilGetIcqTransport( void );

#endif
