#import "JubChatClient.h"

@implementation JubChatClient
@synthesize connection;
@synthesize roster;
@synthesize contactManager;
@synthesize presence;
@synthesize ui;

- initWithConfig: (JubConfig*)config
{
	self = [super init];

	@try {
		connection = [XMPPConnection new];

		connection.username = config.username;
		connection.domain = config.domain;
		connection.server = config.server;
		connection.password = config.password;
		[connection addDelegate: self];

		roster = [[XMPPRoster alloc] initWithConnection: connection];
		[roster addDelegate: self];

		contactManager = [[XMPPContactManager alloc]
				      initWithConnection: connection
						  roster: roster];

		streamManagement = [[XMPPStreamManagement alloc]
		    initWithConnection: connection];

		[connection asyncConnectAndHandle];
	} @catch (id e) {
		[self release];
		@throw e;
	}

	return self;
}

- (void)dealloc
{
	[roster release];
	[contactManager release];
	[streamManagement release];
	[connection release];
	[presence release];

	[super dealloc];
}

- (void)connection: (XMPPConnection*)connection_
     wasBoundToJID: (XMPPJID*)jid
{
	of_log(@"Bound to JID: %@", [jid fullJID]);

	[roster requestRoster];
}

-   (void)connection: (XMPPConnection*)connection_
  didReceivePresence: (XMPPPresence*)presence_
{
	if ([presence_.from isEqual: connection.JID]) {
		[ui          client: self
		  didChangePresence: presence_];
		OF_SETTER(presence, presence_, YES, 0);
	}
}

- (void)rosterWasReceived: (XMPPRoster*)roster
{
	XMPPPresence *pres = [XMPPPresence presence];
	[pres setStatus: @"Hello from JubJub"];
	[connection sendStanza: pres];
}
@end
