package org.appfuse.webapp.action;


import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.appfuse.Constants;
import org.appfuse.service.ResumeManager;
import org.appfuse.webapp.form.ReferenceForm;


/**
 * Implementation of <strong>Action</strong> that interacts with the {@link
 * ReferenceForm} and retrieves values. It interacts with the {@link
 * ResumeManager} to retrieve/persist values to the database.
 *
 * <p>
 * <a href="ReferenceAction.java.html"><i>View Source</i></a>
 * </p>
 *
 * @author <a href="mailto:[email protected]">Matt Raible</a>
 * @version $Revision: 1.1 $ $Date: 2004/03/31 13:04:24 $
 *
 * @struts.action name="referenceForm" path="/editReference"
 *       scope="request" validate="false" parameter="action" input="edit" 
 * @struts.action name="referenceForm" path="/saveReference"
 *      scope="request" validate="true" parameter="action" input="edit" 
 *
 * @struts.action-forward name="edit" path=".references"
 */
public final class ReferenceAction extends BaseAction {
    // ========================================================
    private Log log = LogFactory.getLog(ReferenceAction.class);

    // ================================================================

    public ActionForward edit(ActionMapping mapping, ActionForm form,
                              HttpServletRequest request,
                              HttpServletResponse response)
    throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering 'edit' method");
        }

        ReferenceForm referenceForm = (ReferenceForm) form;

        if ((referenceForm.getId() == null) || "".equals(referenceForm.getId())) {
            ActionErrors errors = new ActionErrors();
            errors.add(ActionErrors.GLOBAL_ERROR,
                       new ActionError("errors.required", "reference.id"));
            saveErrors(request, errors);

            return mapping.getInputForward();
        }

        ResumeManager mgr = (ResumeManager) getBean("resumeManager");
        request.setAttribute(Constants.REFERENCE_KEY, 
                mgr.getReference(referenceForm.getId()));
        request.setAttribute(Constants.REFERENCES, 
                mgr.getReferences(referenceForm.getResumeId()));

        request.setAttribute("menuUrl", "references.do");
        
        // return a forward to edit forward
        return mapping.findForward("edit");
    }

    public ActionForward delete(ActionMapping mapping, ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
    throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering 'delete' method");
        }

        ReferenceForm referenceForm = (ReferenceForm) form;

        if ((referenceForm.getId() == null) || "".equals(referenceForm.getId())) {
            ActionErrors errors = new ActionErrors();
            errors.add(ActionErrors.GLOBAL_ERROR,
                       new ActionError("errors.required", "reference.id"));
            saveErrors(request, errors);

            return mapping.getInputForward();
        }

        ResumeManager mgr = (ResumeManager) getBean("resumeManager");

        mgr.removeObject(convert(referenceForm));

        ActionMessages messages = new ActionMessages();
        messages.add(ActionMessages.GLOBAL_MESSAGE,
                     new ActionMessage("reference.deleted"));
        saveMessages(request, messages);

        return setupList(mapping, request, referenceForm.getResumeId());
    }

    public ActionForward save(ActionMapping mapping, ActionForm form,
                              HttpServletRequest request,
                              HttpServletResponse response)
    throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering 'save' method");
        }

        ReferenceForm referenceForm = (ReferenceForm) form;
        boolean isNew = ("".equals(referenceForm.getId()));

        ResumeManager mgr = (ResumeManager) getBean("resumeManager");

        mgr.saveObject(convert(referenceForm));

        ActionMessages messages = new ActionMessages();
        String msg = (isNew) ? "reference.added" : "reference.updated";
        messages.add(ActionMessages.GLOBAL_MESSAGE,
                     new ActionMessage(msg, referenceForm.getName()));
        saveMessages(request, messages);

        removeFormBean(mapping, request);

        return setupList(mapping, request, referenceForm.getResumeId());
    }

    public ActionForward search(ActionMapping mapping, ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
    throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering 'search' method");
        }

        ReferenceForm reference = (ReferenceForm) form;
        String resumeId = reference.getResumeId();
        return setupList(mapping, request, resumeId);
    }

    public ActionForward setupList(ActionMapping mapping,
                                   HttpServletRequest request, String resumeId)
    throws Exception {

        if (resumeId == null) {
            resumeId = getResumeId(request);
        }

        ResumeManager mgr = (ResumeManager) getBean("resumeManager");

        List references = mgr.getReferences(resumeId);
        request.setAttribute(Constants.REFERENCES, references);

        ReferenceForm referenceForm = new ReferenceForm();
        referenceForm.setResumeId(resumeId);
        request.setAttribute(Constants.REFERENCE_KEY, referenceForm);

        // lookup the resume and stuff it in the request too
        request.setAttribute(Constants.RESUME_KEY, mgr.getResume(resumeId));

        request.setAttribute("menuUrl", "references.do");
        
        return mapping.findForward("edit");
    }
}