package test;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.ArrayList;
import java.util.List;
import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.ListDataModel;

/**
 * User Backing Bean for registration and user management
 * <p/>
 * User: Mick Knutson
 * Date: Oct 19, 2006
 * Time: 12:56:04 PM
 * To change this template use File | Settings | File Templates.
 */
public class UserBackingBeanImpl
        implements Serializable {

    /**
     * Commons / Log4J Loggin object
     */
    private Log log = LogFactory.getLog(this.getClass());
    private User user;
    private String username;

    private UserManager manager;
    private List users;

    public List getUsers() {
    	if (null == users)
    	{
    		initializeUsers();
    	}
		return users;
	}

	public void setUsers(List userList) {
		this.users = userList;
	}

	/**
     * Creates a new UserBackingBeanImpl object.
     */
    public UserBackingBeanImpl() {
        log.info("UserBackingBeanImpl()");
    }

    /**
     * @see com.baselogic.tro.user.UserBackingBean#setUserManager(com.baselogic.tro.user.UserManager)
     */
    public void setUserManager(UserManager manager) {
        this.manager = manager;
    }

    /**
     * @see com.baselogic.tro.user.UserBackingBean#getUser()
     */
    public User getUser() {
        return user;
    }

    /**
     * @see com.baselogic.tro.user.UserBackingBean#setUser(com.baselogic.tro.user.User)
     */
    public void setUser(User user) {
        this.user = user;
    }


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * @see com.baselogic.tro.user.UserBackingBean#prepareForEdit()
     */
    public String prepareForEdit(){
        log.info("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        log.info("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        log.info("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        log.info("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        log.info("UserBackingBean.prepareForEdit(String)");
        log.info("UserBackingBean.user.username(): " + user.getUsername());

        String outcome = Constants.FAILURE;

        try {
        	user = manager.getUser(user);
            log.info("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
            log.info("user.toString(): " + user.toString());
            log.info("++++++++++++++++++++++++++++++++++++++++++++++++++++++");

            outcome = Constants.EDIT;

        } catch (Exception e) {
            outcome = Constants.FAILURE;
            FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(e.getMessage()));
            e.printStackTrace();
            return(null);
        }
        return outcome;
    }

    /**
     * @see com.baselogic.tro.user.UserBackingBean#getUsers()
     */
    public void initializeUsers() {
        log.info("UserBackingBean.getUsers()");

        try {
            users = manager.getUsers();

            log.info("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
            log.info("users: " + users.size());
            log.info("users.toString(): " + users.toString());
            log.info("++++++++++++++++++++++++++++++++++++++++++++++++++++++");

            log.info("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
            log.info("users.size(): " + users.size());
            log.info("users.toString(): " + users.toString());
            log.info("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(e.getMessage()));
            e.printStackTrace();
        }
    }

    /**
     * @see com.baselogic.tro.user.UserBackingBean#saveUser(com.baselogic.tro.user.User)
     */
    public String saveUser(User user) throws UserExistsException{

        log.info("UserBackingBean.saveUser(User)");

        String outcome = Constants.FAILURE;

        try {
            manager.saveUser(user);

            log.info("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
            log.info("user.toString(): " + user.toString());
            log.info("++++++++++++++++++++++++++++++++++++++++++++++++++++++");

            outcome = "success";

        } catch (UserExistsException e) {
            outcome = Constants.FAILURE;
            FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(e.getMessage()));
            e.printStackTrace();
        }
        return outcome;
    }

    /**
     * @see com.baselogic.tro.user.UserBackingBean#removeUser(String)
     */
    public void removeUser(String username){
        manager.removeUser(username);
    }


    /**
     * DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public String clear() {
        log.info("clear()");
        log.error("=========================================================");
        log.error("=========================================================");
        log.error("=========================================================");
        log.error("=========================================================");
        user = new User();

        return Constants.CLEAR;
    }

    /**
     * DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public String cancel() {
        log.info("cancel()");
        user = new User();

        return Constants.CANCEL;
    }

    /**
     * DOCUMENT ME!
     *
     * @return DOCUMENT ME!
     */
    public String createUser() {
        log.info("createUser()");

        FacesContext context = FacesContext.getCurrentInstance();

        try {
            manager.saveUser(getUser());
            log.info("user: " + getUser().toString());
        } catch (Exception e) {
            String failureMessage = "Duplicate user name. Username already exists";
            log.error(
                "============================================================================================");
            log.error(failureMessage);

            //e.printStackTrace();
            // add message to be displayed on the page via <h:messages> tag
            context.addMessage(null, new FacesMessage(failureMessage));

            return (null);
        }

        return Constants.SUCCESS;
    }

}
 // The End...
