package org.bodington.sakai;

import java.util.Collection;

import org.apache.log4j.Logger;
import org.bodington.database.PrimaryKey;
import org.bodington.server.BuildingContext;
import org.bodington.server.BuildingServerException;
import org.bodington.server.realm.PassPhrase;
import org.bodington.server.realm.User;
import org.bodington.server.realm.WebAuthUser;
import org.sakaiproject.user.api.UserDirectoryProvider;
import org.sakaiproject.user.api.UserEdit;

public class BodingtonUserDirectoryProvider implements UserDirectoryProvider {
	
	private static Logger log = Logger.getLogger(BodingtonUserDirectoryProvider.class);

	public boolean authenticateUser(String eid, UserEdit edit, String password) {
		if (getUser(edit)) {
			try {
				BuildingContext.startContextForAuthentication();
				PassPhrase passPhrase = PassPhrase.findPassPhraseByUserName(eid);
				if (passPhrase != null) {
					return passPhrase.isPassPhrase(password);
				}
			} catch (BuildingServerException bse) {
				log.error("Problem loading passphrase.");
			} finally {
				BuildingContext.endContext();
			}
		}
		return false;
	}

	public boolean authenticateWithProviderFirst(String eid) {
		return false;
	}

	public boolean createUserRecord(String eid) {
		return false;
	}

	public void destroyAuthentication() {

	}

	public boolean findUserByEmail(UserEdit edit, String email) {
		return false;
	}

	public boolean getUser(UserEdit edit) {
		String eid = edit.getEid();
		User user = findUserByEid(eid);
		
		if (user != null) {
			edit.setFirstName(user.getName().substring(0,user.getName().indexOf(' ')));
			edit.setLastName(user.getSurname());
		} else {
			log.warn("Couldn't find user: "+eid);
		}
		return user != null;
	}

	private User findUserByEid(String eid) {
		User user = null;
		try {
			BuildingContext.startContextForAuthentication();
			user = User.findUser(new PrimaryKey(Integer.parseInt(eid)));
		} catch (NumberFormatException nfe) {
			// Maybe we are using usernames?
			try {
				PassPhrase passPhrase = PassPhrase.findPassPhraseByUserName(eid);
				if (passPhrase != null) {
					user = passPhrase.getUser();
				} else {
					WebAuthUser webAuthUser = WebAuthUser.findWebAuthUserByUserName(eid);
					if (webAuthUser != null)
						user = webAuthUser.getUser();
				}
					
			} catch (BuildingServerException e) {
				log.error("Problem loading user.", e);
			}
		} catch (BuildingServerException e) {
			log.error("Failed to find user by primary key",e);
		} finally {
			BuildingContext.endContext();
		}
		return user;
	}

	public void getUsers(Collection users) {
		for (Object user: users) {
			if (!getUser((UserEdit)user))
				users.remove(user);
		}
	}

	public boolean updateUserAfterAuthentication() {
		return false;
	}

	public boolean userExists(String eid) {
		return findUserByEid(eid) != null;
	}

}
