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.model.Education;
import org.appfuse.service.ResumeManager;
import org.appfuse.webapp.form.EducationForm;


/**
 * Implementation of <strong>Action</strong> that interacts with the {@link
 * EducationForm} and retrieves values. It interacts with the {@link
 * ResumeManager} to retrieve/persist values to the database.
 *
 * <p>
 * <a href="EducationAction.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="educationForm" path="/editEducation"
 *       scope="request" validate="false" parameter="action" input="edit"
 * @struts.action name="educationForm" path="/saveEducation"
 *      scope="request" validate="true" parameter="action" input="edit"
 *
 * @struts.action-forward name="edit" path=".education"
 */
public final class EducationAction extends BaseAction {
    // ========================================================
    private Log log = LogFactory.getLog(EducationAction.class);

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

        EducationForm educationForm = (EducationForm) form;

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

            return mapping.getInputForward();
        }

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

        Education ed = (Education) mgr.getEducation(educationForm.getId());
        educationForm = (EducationForm) convert(ed);
        request.setAttribute(Constants.EDUCATION_KEY, 
                convertDates(ed, educationForm));

        List schools = mgr.getSchools(educationForm.getResumeId());
        request.setAttribute(Constants.SCHOOLS, schools);

        request.setAttribute("menuUrl", "schools.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");
        }

        EducationForm educationForm = (EducationForm) form;

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

            return mapping.getInputForward();
        }

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

        mgr.removeObject(convert(educationForm));

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

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

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

        EducationForm educationForm = (EducationForm) form;
        boolean isNew = ("".equals(educationForm.getId()));

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

        mgr.saveObject(convert(educationForm));

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

        removeFormBean(mapping, request);

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

    public ActionForward search(ActionMapping mapping, ActionForm form,
                                HttpServletRequest request,
                                HttpServletResponse response)
    throws Exception {
        if (log.isDebugEnabled()) {
            log.debug("Entering 'search' method");
        }
        
        EducationForm education = (EducationForm) form;
        String resumeId = education.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 schools = mgr.getSchools(resumeId);
        request.setAttribute(Constants.SCHOOLS, schools);

        EducationForm educationForm = new EducationForm();
        educationForm.setResumeId(resumeId);
        request.setAttribute(Constants.EDUCATION_KEY, educationForm);

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

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