class LoginHandler extends AgoraHandler
{
    AgoraUserBase userBase = null;
	AgoraGroup group = null;

    public LoginHandler (AgoraUserBase userBase, AgoraGroup group) {
        this.userBase = userBase;
		this.group = group;
    }

    public boolean handleEvent (AgoraEvent theEvent) {
		AgoraServerSession session = (AgoraServerSession)theEvent.getSource();
        switch (theEvent.getId()) {
            case AgoraEvent.LOGIN: {
                AgoraEvent reply = new AgoraEvent (theEvent);
                int userId = userBase.getUserFromLogin (theEvent.getArgument(0));

                if (userId != -1) {
					AgoraUser user = new AgoraUser();
					group.loadUser(user,userId);
                    if (user.correctPassword(theEvent.getArgument(1))) {
						if (group.memberDirectory(userId).exists()) {
							session.setUser(user);
							group.loginSession(session);
							removeSession(session);
							userBase.setIPForLogin(user.getLogin(),session.getConnection().getAddress());
							reply.addArgument("yes");
						}
                        else {
							session.setUser(user);
                            reply.addArgument("join");
							group.getPersonalInfo(userId,reply);
                        }
                        sendResponse(theEvent,reply);
                    }
                    else {
						session.setUser(null);
                        reply.addArgument("no");
                        sendResponse(theEvent,reply);
                    }
                }
                else {
					session.setUser(null);
                    reply.addArgument("unknown");
                    sendResponse(theEvent,reply);
                }
                return (true);
            }
            case AgoraEvent.JOIN: {
                AgoraEvent reply = new AgoraEvent (theEvent);
                AgoraUser user;
                if (session.getUser() != null) {
					theEvent.removeFirstArgument();
					if (!group.setPersonalInfo(session.getUser().getId(),theEvent,false)) {
						reply.addArgument("nick");
						sendResponse(theEvent,reply);
					}
					else {
						group.loadUser(session.getUser(),session.getUser().getId());
						group.loginSession(session);
						removeSession(session);
						userBase.setIPForLogin(session.getUser().getLogin(),session.getConnection().getAddress());
						reply.addArgument("yes");
						sendResponse(theEvent,reply);
					}
				}
				else {
                    int userId = userBase.getUserFromLogin (theEvent.getArgument(0));
                    if (theEvent.getArgument(0).length() == 0 || userId != -1) {
                        reply.addArgument("exists");
                        sendResponse(theEvent,reply);
                    }
					else {
						if (theEvent.getArgument(2).length() > 0 && group.uniqueNick(theEvent.getArgument(2))) {
							userId = userBase.addUser(-1,theEvent.getArgument(0));
							if (userId != -1) {
								theEvent.removeFirstArgument();
								if (!group.setPersonalInfo(userId,theEvent,false)) {
									reply.addArgument("nick");
									sendResponse(theEvent,reply);
								}
								else {
									user = new AgoraUser();
									group.loadUser(user,userId);
									session.setUser(user);
									group.loginSession(session);
									removeSession(session);
									userBase.setIPForLogin(user.getLogin(),session.getConnection().getAddress());
									reply.addArgument("yes");
									sendResponse(theEvent,reply);
								}
							}
							else {
								reply.addArgument("no");
								sendResponse(theEvent,reply);
							}
						}
						else {
							reply.addArgument("nick");
							sendResponse(theEvent,reply);
						}
					}
				}
				return (true);
            }
        }
        return (false);
    }
}

